關於C++中ios::sync_with_stdio(false)
粘貼自:https://blog.csdn.net/weixin_44015865/article/details/84974373
在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。
以下代碼是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
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);這個可以大幅提高大數據的輸入和輸出以節省時間
關於C++中ios::sync_with_stdio(false)