1. 程式人生 > >關於C++中ios::sync_with_stdio(false);

關於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);這個可以大幅提高大資料的輸入和輸出以節省時間