C++でstd::ios::sync_を利用with_stdio(false)TLE問題の解決

5057 ワード

2018-1-23
C++のcinでデータを読み取ることについては、Cのscanfに比べて速度が遅いことが知られています.の
まず、私はランダムに1000000個の整数を生成しました.
#include
#include

int main(){
    FILE *f=fopen("data.txt","w");
    for (int i=0;i<10000000;i++){
        fprintf (f,"%d ",rand());   
    }
    return 0;
}

次にscanfで読み取りを行い、読み取り時間を計算します.
#include
#include 
#include

int main(){
    int start=clock();
    FILE *f=freopen("data.txt","r",stdin);
    for (int i=0;i<10000000;i++){
        int t;
        scanf("%d",&t);
    }
    printf("%.3lf
"
,double(clock()-start)/CLOCKS_PER_SEC); retun 0; }

結果は1.782で、これはwindowsの下のDevの中でコンパイルして実行したので、
#include
#include
#include 
#include
using namespace std;

int main(){
    int start=clock();
    FILE *f=freopen("data.txt","r",stdin);
    for (int i=0;i<10000000;i++){
        int t;
        std::cin>>t;
    }
    printf("%.3lf
"
,double(clock()-start)/CLOCKS_PER_SEC); return 0; }

この場合の結果は9.701でstd::ios::sync_を加えますwith_stdio(false)
#include
#include
#include 
#include
using namespace std;

int main(){
    int start=clock();
    FILE *f=freopen("data.txt","r",stdin);
    std::ios::sync_with_stdio(false);
    for (int i=0;i<10000000;i++){
        int t;
        std::cin>>t;
    }
    printf("%.3lf
"
,double(clock()-start)/CLOCKS_PER_SEC); return 0; }

2.166になり、明らかにスピードが速くなりました.
cin      ,       ,cin stdin       ,       
      ,           ,  cout stdout   ,   
         。           ,  cin        ,
         ?      std::ios::sync_with_stdio(false);
       cin stdin    。