c++讀入優化


對於輸入數據非常大的一些可(變)愛(態)題目,scanf就會大大拖慢程序的運行速度,cin就更不用說了,所以我們要用一種高大上的東西——讀入優化。

讀入優化的原理其實就是一個一個字符的讀入,再組成數字

==================================================================

下面貼一段讀入優化的模板

 1 int read()
 2 {
 3     int x=0,f=1;
 4     char ch;
 5     while(ch<'0'||ch>'9')  {if(ch=='-')f=-1;ch=getchar();}
 6     while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
 7     return f*x;
 8 }

這就是最基本的讀入優化,通過getchar函數依次讀入字符,用x記錄答案,用f判斷正負。

ps:在主程序中調用時int n=read();即可

===========================前方高能預警===============================

下面是dalao的讀入優化模板

1 template<class T>void read(T &x)
2 {
3     x=0;int f=0;char ch=getchar();
4     while(ch<'0'||ch>'9')  {f|=(ch=='-');ch=getchar();}
5     while(ch>='0'&&ch<='9'){x=(x<<1)+(x<<3)+(ch^48);ch=getchar();}
6     x=f?-x:x;
7     return;
8 }

template就是讓這個函數隨時可以調用,而且可以用int、double、char……(反正很裝13就對了)

用了指針,會快更會裝13。

下面的f|=(ch=='-')如果ch==‘-’,f就改符號(還可以判斷多個負號),位運算,會快

<<x就相當於2^x,會非常快;

最后問號表達式裝13

總之就是一個優(裝)化(B)的讀入優化

ps:不過TA真的比普通的讀入優化要很多

pss:調用時直接read(n)就好了這就是指針的好處

===========================我是分割線================================

以下的讀入優化需要在freopen條件下使用(其實用的不是很多,大多數情況用上面那種)

 下面是比以上讀優都要快的julao的讀入優化(划重點)fread

 1 inline char GET_CHAR(){
 2     static char buf[maxn],*p1=buf,*p2=buf;
 3     return p1==p2&&(p2=(p1=buf)+fread(buf,1,maxn,stdin),p1==p2)?EOF:*p1++;
 4 }
 5 template<class T>void read(T &x)
 6 {
 7     x=0;int f=0;char ch=GET_CHAR();
 8     while(ch<'0'||ch>'9')  {f|=(ch=='-');ch=GET_CHAR();}
 9     while(ch>='0'&&ch<='9'){x=(x<<1)+(x<<3)+(ch^48);ch=GET_CHAR();}
10     x=f?-x:x;
11     return;
12 }

簡單的來說就是把getchar函數手寫,改為文件讀入(fread)。

eg:fread原理:把數據流整段的存到數組buf中,整段的讀取,數組存滿了再重新覆蓋。所以比getchar()一個一個讀要快

其實我也不是很懂fread,感性理解吧QAQ。

===========================我是分割線================================

一點點忠告:說實話用不用讀入優化完全看自己,如果要用就把它當做一個模板,哪怕是a+b的時候也打上。我就是這樣(有點讀入情節)雖然有的時候並不能快多少,但是至少會讓自己的代碼效率稍微高那么一丟丟,而且天天打,永遠不會錯。

但有些dalao平時不用,考試的時候打上,其實我不太建議這樣。因為身邊有好幾個朋友都是因為在考場上讀優打錯,然后0分。非常的可惜,所以如果考試要用的話最好多打幾次保證自己不會錯,防止在復賽上gg

NOIP2018RP++;

感謝學姐uncle-lu的模板

61646D696E


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM