上一篇文章: https://blog.dotcpp.com/a/56701#blogdis2868

        我大致介绍了一下C++中的一些输入输出流的优化,这个技巧在算法竞赛中蛮实用的,可以帮助你让C++输入输出达到(接近)于C的输入输出的速度,这点在大数据处理上面是相当有用的。

        有人提到了read(),的确,read可以更加凶的帮助你输入,但是我们如果快速写完,同时,还要涉及输出的话,还是Printf这样快速,C++经过上一篇文章所提到的优化也可以达到这样的输出速度。

那么,我在文章评论中看到了一位同学的回复:

{QWGFI`{{BQL@2QJC(2D93I.png

可是介于网站的回复字数限制,我本来想敲蛮多给他的,结果发现根本写不下.....

所以这篇帖子就当作番外篇,介绍介绍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.png

(见-图1,由于上一个输入提示没有<<endl结尾,造成了其不知如何结束,就以识别一个换行为准进行了输出,这就造成了输入再提示。)

2.png

(见-图2,注释掉优化代码后,恢复正常)


        总结一下,这个cin.tie;;;;;;cout.tie这些话,是更具层次的解除绑定,一般来说会用就行了,继续深挖原理可以挖到更多宝贝,可以追溯到C++起源去了........有兴趣的可以再去翻吧......

        回复完毕。

点赞(3)
 

0.0分

0 人评分

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

评论列表 共有 0 条评论

暂无评论