首页 > 解决方案 > 当 cin 和 cout 解开时使用 std::endl vs "\n"

问题描述

Fast I/O建议在编程比赛中使用以下两行来加速 IO:

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

我可以理解删除同步。但是在解开 cin 和 cout 之后,如何确保缓冲区不会溢出,cin 和 cout 可以正常工作而不会阻塞,并且当我不使用 std::endl 时缓冲区会正确刷新。使用“\n”会自动处理它吗?

标签: c++c++11c++14

解决方案


如何确保缓冲区不会溢出,

输出缓冲区不会“溢出”。当它变满时,它会自动刷新,即它的内容被写出并且它的长度被重置为0。无论cin/是否cout被绑定都是这种情况。

cin 和 cout 正常工作而不会阻塞

您通常希望cin/cout上的操作被阻止。cin但同样,阻塞与非阻塞 I/O 与/cout是否绑定无关。

当我不使用 std::endl 时,缓冲区会被正确刷新。使用“\n”会自动处理它吗?

'\n'如果流处于行缓冲模式,则输出仅刷新缓冲区。cout如果输出到终端,则自动进入行缓冲模式;否则它是块缓冲的(即它只有在运行满时才会被刷新)。

在编程比赛中cout通常会进入管道或日志文件,因此它将被块缓冲并且'\n'不会导致刷新。但是,在这种情况下,在读取输入之前是否显示提示也无关紧要(这是绑定cin/的正常用例cout)。只需确保生成正确的输出并让 I/O 库担心缓冲。缓冲区在运行满时、流关闭时以及程序退出时会自动刷新。不会丢失任何输出(除非您的程序崩溃,但您还有其他事情要担心)。


推荐阅读