std::ios::sync_with_stdio(false),tie(0)及其侷限性

2020-10-04 11:00:19

std::ios::sync_with_stdio(false)提高效率

在c++中之所以cin,cout效率低,是因為先把要輸出的東西存入緩衝區,再輸出,導致效率降低,而這段語句可以來打消iostream的輸入和輸出快取,可節省時間,使效率與scanf與printf相差無幾,還有應注意的是scanfprintf使用的標頭檔案應是stdio.h而不是 iostream。

tie 函數

tie是將兩個stream繫結的函數,空引數的話返回當前的輸出流指標。
在ACM裡,經常出現 資料集超大造成 cin TLE的情況。我們可以在IO之前將stdio解除繫結,這樣做了之後要注意不要同時混用cout和printf 之類。
在預設的情況下cin繫結的是cout,每次執行 << 操作符的時候都要呼叫flush,這樣會增加IO負擔。可以通過tie(0)(0表示NULL)來解除cin與cout的繫結,進一步加快執行效率。

侷限性

使用std::ios::sync_with_stdio(false)後,cin()cout()不能與printf()scanf()混合使用。

#include<iostream>
#include<cstdio>
using namespace std;
int main(){
	std::ios::sync_with_stdio(false); 
	cin.tie(0);
	int a,b,c,d,e;
	cin>>a>>b>>c;
	scanf("%d %d",&d,&e);
	cout<<a<<endl;
	printf("%d\n",d);
	cout<<b<<c<<endl;
	printf("%d\n",e);
	return 0;
}
  • 執行結果
    運行結果
    我們發現printf()的位置提前了,而且這與他在程式碼中的位置無關。