Fast I/O建议在编程比赛中使用以下两行代码来加快IO:
ios_base::sync_with_stdio(false);
cin.tie(NULL);
我可以理解删除同步。但是在取消cin和cout的绑定后,如何确保缓冲区不会溢出,当我不使用std :: endl时,cin和cout可以正常工作而不会阻塞,并且可以正确刷新缓冲区。使用“ \ n”会自动处理吗?
答案 0 :(得分:4)
如何确保缓冲区不会溢出
输出缓冲区不会“溢出”。装满后,它会自动刷新,即,将其内容写出,并将其长度重置为0。无论是否cin
/ cout
被捆绑在一起,都是这种情况。
cin和cout可以正常工作而不会阻塞
您通常希望阻止cin
/ cout
上的操作。但是同样,阻塞与非阻塞I / O与cin
/ cout
是否绑定无关。
当我不使用std :: endl时,缓冲区会正确刷新。使用“ \ n”会自动处理吗?
仅在流处于行缓冲模式时才输出'\n'
刷新缓冲区。如果输出到终端,cout
会自动进入行缓冲模式;否则,它会被块缓冲(即,仅在其完全运行时才被刷新)。
在编程比赛中,cout
通常进入管道或日志文件,因此它将被块缓冲,并且'\n'
不会引起刷新。但是,在那种情况下,在读取输入之前是否显示提示也没关系(这是绑定cin
/ cout
的正常使用情况)。只要确保您产生正确的输出,并让I / O库担心缓冲即可。当缓冲区运行满,关闭流并退出程序时,将自动刷新该缓冲区。没有输出丢失(除非您的程序崩溃,否则您还有其他事情要担心)。