上一篇文章: https://blog.dotcpp.com/a/56701#blogdis2868
我大致介绍了一下C++中的一些输入输出流的优化,这个技巧在算法竞赛中蛮实用的,可以帮助你让C++输入输出达到(接近)于C的输入输出的速度,这点在大数据处理上面是相当有用的。
有人提到了read(),的确,read可以更加凶的帮助你输入,但是我们如果快速写完,同时,还要涉及输出的话,还是Printf这样快速,C++经过上一篇文章所提到的优化也可以达到这样的输出速度。
那么,我在文章评论中看到了一位同学的回复:
可是介于网站的回复字数限制,我本来想敲蛮多给他的,结果发现根本写不下.....
所以这篇帖子就当作番外篇,介绍介绍cin.tie()的作用。
在默认的情况下cin绑定的是cout,每次执行 << 操作符的时候都要调用flush,这样会增加IO负担。可以通过tie(0)(0表示NULL)来解除cin与cout的绑定,进一步加快执行效率。
注意,我们iostream于stdio拥有绑定,目的为了让C++兼容C,大体是通过缓存的方式来达到效果(这样说比较片面,但是我就目前只这样解释好了/23333333),同时,我们的cin与cout还有一个绑定,这一个绑定使得我们可以确保上下输入输出的层级不会被打乱,然而在竞赛中,一般也不会要求你输出什么,”请输入一个n之类“的这样的输入提示,所以在竞赛中,这个绑定 就会变得碍手碍脚的。
可以通过这个代码来体现
#include<bits/stdc++.h> #define hh ios::sync_with_stdio(false),cin.tie(0),cout.tie(0); //注释掉试试 using namespace std; int main(){ hh; //注释掉试试 int n; long k=0; cout<<"这是一个输入提示,请输入n"; cin>>n; cout<<"输入成功!!!!耶"<<endl; while(n){ k+=n; n--; } cout<<"从1-n的和为:"<<k<<endl; return 0; }
写完之后,运行,可以发现,这个代码让你先输入,再弹出提示输入信息。
(见-图1,由于上一个输入提示没有<<endl结尾,造成了其不知如何结束,就以识别一个换行为准进行了输出,这就造成了输入再提示。)
(见-图2,注释掉优化代码后,恢复正常)
总结一下,这个cin.tie;;;;;;cout.tie这些话,是更具层次的解除绑定,一般来说会用就行了,继续深挖原理可以挖到更多宝贝,可以追溯到C++起源去了........有兴趣的可以再去翻吧......
回复完毕。
0.0分
0 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复