關於C++中ios::sync_with_stdio(false);
在C++中的輸入和輸出有兩種方式,一種是scanf和printf,另一種是cin和cout,在#include<bits/stdc++.h>這個萬能標頭檔案下,這兩種方式是可以互換的
C++和C很相似,很多大佬都用C++寫C,但是在後面的一種方式中cin和cout的輸入和輸出效率比第一種低,原來而cin,cout之所以效率低,是因為先把要輸出的東西存入緩衝區,再輸出,導致效率降低,而這段語句可以來打消iostream的輸入 輸出快取,可以節省許多時間,使效率與scanf與printf相差無幾,還有應注意的是scanf與printf使用的標頭檔案應是stdio.h而不是 iostream。
在學校的OJ上後面的時間複雜度要求很低,有好多時候TLE不是因為程式碼的問題,對於初學C++的人來說根本不知道ios::sync_with_stdio(false);這個東西。
以下程式碼是SDUT上的一個數據結構的題目
Logout
順序表應用4-2:元素位置互換之逆置演算法(資料改進)
Time Limit: 80 ms Memory Limit: 600 KiB
Problem Description
一個長度為len(1<=len<=1000000)的順序表,資料元素的型別為整型,將該表分成兩半,前一半有m個元素,後一半有len-m個元素(1<=m<=len),設計一個時間複雜度為O(N)、空間複雜度為O(1)的演算法,改變原來的順序表,把順序表中原來在前的m個元素放到表的後段,後len-m個元素放到表的前段。
注意:交換操作會有多次,每次交換都是在上次交換完成後的順序表中進行。
Input
第一行輸入整數len(1<=len<=1000000),表示順序表元素的總數;
第二行輸入len個整數,作為表裡依次存放的資料元素;
第三行輸入整數t(1<=t<=30),表示之後要完成t次交換,每次均是在上次交換完成後的順序表基礎上實現新的交換;
之後t行,每行輸入一個整數m(1<=m<=len),代表本次交換要以上次交換完成後的順序表為基礎,實現前m個元素與後len-m個元素的交換;
Output
輸出一共t行,每行依次輸出本次交換完成後順序表裡所有元素。
Sample Input
10
1 2 3 4 5 6 7 8 9 -1
3
2
3
5
Sample Output
3 4 5 6 7 8 9 -1 1 2
6 7 8 9 -1 1 2 3 4 5
1 2 3 4 5 6 7 8 9 -1
//TLE超時程式碼 #include<bits/stdc++.h> using namespace std; int a[1000010]; void creatlist(int n) { for(int i=0; i<=n-1; i++) { cin>>a[i]; } } void changelist(int n,int m) { int t; while(n<m) { t=a[n]; a[n]=a[m]; a[m]=t; n++; m--; } } void finally(int m,int len) { changelist(0,len-1); changelist(0,len-1-m); changelist(len-m,len-1); } int main() { int len; cin>>len; creatlist(len); int t; cin>>t; while(t>0) { int m; cin>>m; finally(m,len); for(int i=0; i<=len-1; i++) { if(i==len-1) { cout<<a[i]<<endl; } else { cout<<a[i]<<" "; } } t--; } return 0; }
這是我用cout輸出cin輸入的程式碼,結果是TLE,而下面的AC程式碼
//AC程式碼
#include<bits/stdc++.h>
using namespace std;
int a[1000010];
void creatlist(int n)
{
for(int i=0; i<=n-1; i++)
{
cin>>a[i];
}
}
void changelist(int n,int m)
{
int t;
while(n<m)
{
t=a[n];
a[n]=a[m];
a[m]=t;
n++;
m--;
}
}
void finally(int m,int len)
{
changelist(0,len-1);
changelist(0,len-1-m);
changelist(len-m,len-1);
}
int main()
{
ios::sync_with_stdio(false);
int len;
cin>>len;
creatlist(len);
int t;
cin>>t;
while(t>0)
{
int m;
cin>>m;
finally(m,len);
for(int i=0; i<=len-1; i++)
{
if(i==len-1)
{
cout<<a[i]<<endl;
}
else
{
cout<<a[i]<<" ";
}
}
t--;
}
return 0;
}
可以看出這兩段程式碼只有輸入輸出方式不同,但是提交結果一個AC一個TLE,在競賽中,遇到大資料時,往往讀檔案成了程式執行速度的瓶頸,需要更快的讀取方式。相信幾乎所有的C++學習者都在cin機器緩慢的速度上栽過跟頭,於是從此以後發誓不用cin讀資料,知道了ios::sync_with_stdio(false);這個可以大幅提高大資料的輸入和輸出以節省時間