C++ios::sync_with_stdio(false) 与 cin.tie 加速 IO

Posted ZSYL

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++ios::sync_with_stdio(false) 与 cin.tie 加速 IO相关的知识,希望对你有一定的参考价值。

前言

之前写题遇到大数据量(cin、cout 数据量级达到 1e5、1e6 ),因为考虑 IO 性能报错 TLE,故选择 scanf、printf 替代 cin、cout,以解决问题。

ios::sync_with_stdio(false)

在C++中之所以cin,cout效率低,是因为先把要输出的东西存入缓冲区,再输出,导致效率降低,而这段语句可以来打消iostream的输入和输出缓存,可节省时间,使效率与scanfprintf相差无几,还有应注意的是scanfprintf使用的头文件应是stdio.h而不是 iostream

在调用 ios::sync_with_stdio(false) 后,cout 与 stdout 不再共享同一块缓冲区,它们分别管理自己的缓冲区。简述,函数作用为设置标准 C++ 流是否与标准 C 流在每次输入/输出操作后同步。

正是因为这种同步,所以 cin、cout 比 scanf、printf 速度要慢,如果我们在使用 cin、cout 输入输出前加一句 ios::sync_with_stdio(false),即取消缓冲区同步,可节省时间,效率与 scanf、printf 相差无几。

具体功能,需要注意以下几点:

1、实践中,这表示同步的 C++ 流为无缓冲,而每次 C++ 流上的 I/O 都立即应用到对应 C 流的缓冲区。这使得能自由地混合 C++ 与 C I/O 。
2、同步的 C++ 流保证为线程安全(从多个线程输出的单独字符可能交错,但无数据竞争)。
3、若关闭同步,则允许 C++ 标准流独立地缓冲其 I/O ,可认为这在某些情况下更快。
4、所有八个标准 C++ 流默认与其相应的 C 流同步。
5、若在标准流上已出现 I/O 后调用此函数,则行为是实现定义的:有的实现无效果,有的实现销毁读取缓冲区。

cin.tie(0)

tie 是一个函数,将两个 stream 绑定,空指针的话返回当前输出流指针

在ACM里,经常出现 数据集超大造成 cin TLE的情况。我们可以在IO之前将stdio解除绑定,这样做了之后要注意不要同时混用cout和printf 之类。

在默认的情况下cin绑定的是cout,每次执行 << 操作符的时候都要调用flush,这样会增加IO负担。可以通过tie(0)(0表示nullptr)来解除cin与cout的绑定,进一步加快执行效率。

Link

加油!

感谢!

努力!

以上是关于C++ios::sync_with_stdio(false) 与 cin.tie 加速 IO的主要内容,如果未能解决你的问题,请参考以下文章

使用std::ios::tie与std::ios_base::sync_with_stdio加速流

关于ios::sync_with_stdio(false)的一些问题

C++输入输出流加速器,关闭同步流,ios::sync_with_stdio(false)和 cin.tie

AtCoder Beginner Contest 235 A~F

AtCoder Beginner Contest 235 A~F

std::ios_base::sync_with_stdio(false),优点,缺点?