c++ - 当 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”会自动处理它吗?
解决方案
如何确保缓冲区不会溢出,
输出缓冲区不会“溢出”。当它变满时,它会自动刷新,即它的内容被写出并且它的长度被重置为0。无论cin
/是否cout
被绑定都是这种情况。
cin 和 cout 正常工作而不会阻塞
您通常希望cin
/cout
上的操作被阻止。cin
但同样,阻塞与非阻塞 I/O 与/cout
是否绑定无关。
当我不使用 std::endl 时,缓冲区会被正确刷新。使用“\n”会自动处理它吗?
'\n'
如果流处于行缓冲模式,则输出仅刷新缓冲区。cout
如果输出到终端,则自动进入行缓冲模式;否则它是块缓冲的(即它只有在运行满时才会被刷新)。
在编程比赛中cout
通常会进入管道或日志文件,因此它将被块缓冲并且'\n'
不会导致刷新。但是,在这种情况下,在读取输入之前是否显示提示也无关紧要(这是绑定cin
/的正常用例cout
)。只需确保生成正确的输出并让 I/O 库担心缓冲。缓冲区在运行满时、流关闭时以及程序退出时会自动刷新。不会丢失任何输出(除非您的程序崩溃,但您还有其他事情要担心)。
推荐阅读
- ios - UITableViewCell 滚动后被删除
- export - 从 Codepen 导出的笔不再有效。我错过了什么?
- python - 如何告诉 mypy 包含存根文件
- python - 与多线程相比,多处理是否加快了文件传输速度
- ios - 如何在使用纹理文件的模型中查找所有 SCNMaterials
- web-services - 无法从 IIS 上托管的 Web 服务调用批处理文件
- java - 搜索领域
- express - Axios 支持 Set-Cookie 吗?是否可以通过 Axios HTTP 请求进行身份验证?
- angular - 如何将调色板中的颜色应用于角度4中的元素
- swift - iPhone 的 FLAC 录音未使用 Google Speech API 进行转换