1.2 Ввод и вывод¶
В большинстве соревнований по программированию ввод и вывод осуществляются через стандартные потоки.
В языке C++:
cin— поток вводаcout— поток вывода
Также можно использовать функции языка C: scanf и printf.
Чтение данных через cin¶
Обычно входные данные состоят из чисел и строк, разделённых пробелами или переводами строки.
Пример чтения данных:
int x, y;
string name;
cin >> x >> y >> name;
Этот код корректно работает, если элементы разделены хотя бы одним пробелом или переносом строки.
Оба варианта ввода будут обработаны одинаково:
45 78 panda
или
45 78
panda
Вывод данных через cout¶
Пример вывода:
int x = 45, y = 78;
string name = "panda";
cout << x << " - " << y << " : " << name << "\n";
Обратите внимание: "\n" работает быстрее, чем endl, потому что endl дополнительно выполняет принудительную очистку буфера (flush).
Ускорение ввода и вывода¶
Иногда ввод и вывод становятся узким местом программы. Чтобы ускорить работу cin и cout, добавьте в начало main():
ios::sync_with_stdio(false);
cin.tie(nullptr);
Это отключает синхронизацию с C-потоками и ускоряет работу программы.
Использование scanf и printf¶
Функции языка C обычно немного быстрее, но менее удобны.
Чтение:
int x, y;
scanf("%d %d", &x, &y);
Вывод:
int x = 45, y = 78;
printf("%d - %d\n", x, y);
Чтение целой строки¶
Если нужно считать строку целиком (включая пробелы), используется getline:
string line;
getline(cin, line);
Например, строка
Hello competitive programming
будет считана полностью, включая пробелы.
Чтение данных неизвестного объёма¶
Если заранее неизвестно, сколько данных будет во входе, удобно использовать цикл:
int value;
while (cin >> value) {
// обработка value
}
Цикл продолжается до тех пор, пока во входном потоке есть данные.
Работа с файлами¶
В некоторых системах соревнований ввод и вывод осуществляется через файлы.
Можно оставить стандартный код, добавив в начало программы:
freopen("data.in", "r", stdin);
freopen("data.out", "w", stdout);
После этого программа будет читать данные из файла data.in и записывать результат в data.out.
Главное, что нужно запомнить¶
- В соревнованиях чаще всего используются стандартные потоки.
- Для ускорения подключайте
ios::sync_with_stdio(false)иcin.tie(nullptr). - Используйте
"\n", а неendl. - Для чтения строк с пробелами используйте
getline. - При большом объёме данных ввод/вывод может быть критичен для прохождения по времени.