Использование std :: endl против "\ n", когда cin и cout развязаны - PullRequest
1 голос
/ 06 июля 2019

Быстрый ввод / вывод рекомендует использовать следующие две строки во время соревнований по программированию для ускорения ввода-вывода:

    ios_base::sync_with_stdio(false); 
    cin.tie(NULL);  

Я могу понять удаление синхронизации. Но после снятия cin и cout, как я могу убедиться, что буфер не переполнен, cin и cout работают правильно без блокировки, а буфер очищается должным образом, когда я не использую std :: endl. Обрабатывает ли автоматически использование «\ n»?

1 Ответ

4 голосов
/ 06 июля 2019

как убедиться, что буфер не переполнен,

Выходной буфер не "переполнен".Когда он заполняется, он автоматически сбрасывается, т.е. его содержимое записывается, а его длина сбрасывается на 0. Это тот случай, если cin / cout связаны или нет.

cin и cout работают правильно, не блокируя

Обычно вы хотите, чтобы операции на cin / cout блокировались.Но опять же, блокирующий и неблокирующий ввод / вывод не имеет никакого отношения к тому, связаны ли cin / cout.

и буфер очищается должным образом, когда я не использую std ::епсИ.Использует ли \ n "автоматически это?cout автоматически переводится в режим линейной буферизации, если выход идет на терминал;в противном случае блок буферизуется (т. е. сбрасывается только при полной загрузке).

В соревновании по программированию cout обычно переходит в канал или файл журнала, поэтому он буферизуется в блоке, а '\n' нене вызывает флешТем не менее, в этой ситуации также не имеет значения, отображаются ли приглашения перед прочтением ввода (что является обычным случаем использования для связанного cin / cout).Просто убедитесь, что вы выводите правильный вывод, и дайте библиотеке ввода-вывода беспокоиться о буферизации.Буфер автоматически сбрасывается при полном заполнении, когда поток закрыт и когда ваша программа завершает работу.Вывод не будет потерян (если ваша программа не работает, но у вас есть другие поводы для беспокойства).

...