C++ 里利用 std::ios::sync_with_stdio(false) 解决TLE问题
生活随笔
收集整理的這篇文章主要介紹了
C++ 里利用 std::ios::sync_with_stdio(false) 解决TLE问题
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
2018-1-23
關(guān)于用C++里面的cin讀取數(shù)據(jù),我們都知道它的速度相對于C里面的scanf是比較慢的。。。
首先,我隨機生成了10000000個整數(shù)
#include<stdio.h> #include<stdlib.h>int main(){FILE *f=fopen("data.txt","w");for (int i=0;i<10000000;i++){fprintf (f,"%d ",rand()); }return 0; }然后我們用scanf進行讀取,計算讀取的時間
#include<stdio.h> #include<stdlib.h> #include<time.h>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\n",double(clock()-start)/CLOCKS_PER_SEC);retun 0; }結(jié)果為1.782,這是在windows下的Dev里面編譯運行的,
#include<iostream> #include<stdio.h> #include<stdlib.h> #include<time.h> 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\n",double(clock()-start)/CLOCKS_PER_SEC);return 0; }這種情況下的結(jié)果為9.701,我們加上std::ios::sync_with_stdio(false)
#include<iostream> #include<stdio.h> #include<stdlib.h> #include<time.h> 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\n",double(clock()-start)/CLOCKS_PER_SEC);return 0; }變成了2.166,速度明顯加快了不少。
cin慢是有原因的,其實默認的時候,cin與stdin總是保持同步的,也就是說這兩種 方法可以混用,而不必擔(dān)心文件指針混亂,同時cout和stdout也一樣,兩者混 用不會輸出順序錯亂。正因為這個兼容性的特性,導(dǎo)致cin有許多額外的開銷, 如何禁用這個特性呢?只需一個語句std::ios::sync_with_stdio(false); 這樣就可以取消cin于stdin的同步了。總結(jié)
以上是生活随笔為你收集整理的C++ 里利用 std::ios::sync_with_stdio(false) 解决TLE问题的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 常见dos命令总结
- 下一篇: spring mvc + freemar