sync_with_stdio

很多人会说cin的速度比scanf慢很多, 其实不然, 其实默认的时候,cin与stdin总是保持同步的,也就是说这两种方法可以混用。而不必担心文件指针混乱,同时cout和stdout也一样,两者混用不会输出顺序错乱。
正因为这个兼容性的特性,导致cin有许多额外的开销。
只需要加上std::ios::sync_with_stdio(false)来关闭同步就好了, 速度甚至要优于scanf。

sync_with_stdio
这个函数是一个“是否兼容stdio”的开关,C++为了兼容C,保证程序在使用了std::printf和std::cout的时候不发生混乱,将输出流绑到了一起。

决定C++标准streams(cin,cout,cerr...)是否与相应的C标准程序库文件(stdin,stdout,stderr)同步,也就是是否使用相同的stream缓冲区,缺省情况是同步的,但由于同步会带来某些不必要的负担,因此该函数作用就是我们自己可以取消同步   
应用
在ACM里,经常出现数据集超大造成 cin TLE的情况。这时候大部分人(包括原来我也是)认为这是cin的效率不及scanf的错,甚至还上升到C语言和C++语言的执行效率层面的无聊争论。
其实像上文所说,这只是C++为了兼容而采取的保守措施。我们可以在IO之前将stdio解除绑定,这样做了之后要注意不要同时混用cout和printf之类。
在默认的情况下cin绑定的是cout,每次执行 << 操作符的时候都要调用flush,这样会增加IO负担。可以通过tie(0)(0表示NULL)来解除cin与cout的绑定,进一步加快执行效率。

#include <iostream>
int main() 
{
    std::ios::sync_with_stdio(false);
    std::cin.tie(0);
    // IO
}


这俩一个输入同步,一个输出同步
sync_with_stdio是输入同步开关
cin.tie是控制输出同步
用哪个关哪个

注意,这两个代码的头文件是 iostream
并且如果用了这两个,就不要用scanf ,getchar,gets,fgets,fscanf了。
好处:将cin cout速度提升至与scanf相差无几。
副作用:不能scanf cin之类的混用了。

猜你喜欢

转载自blog.csdn.net/qq_40794973/article/details/83795025