C++输入、输出优化模板整理
前言
對于在信息學競賽中逐漸深入學習的C++選手們,會發現有些題目的輸入輸出量特別大,有時可能一道題讀入完你就TLE了。那么怎么辦呢?少用cin或者cout,因為如果你對cin或者cout沒有進行一些優化的話,它會跑的很慢,所以你如果不會輸入輸出優化的話,那就乖乖用scanf吧,這樣會相對快一點。
但是呢,scanf速度還是不夠快,那怎么辦呢?那就用輸入輸出優化吧!
前置知識
getchar是讀入函數的一種。它從標準輸入里讀取下一個字符,相當于getc(stdin)。返回類型為int型,為用戶輸入的ASCII碼,出錯返回-1
引用自 百度百科·getchar (計算機語言函數)
看了度娘上的定義,你大概知道getchar()這個函數的定義了吧。然后呢,度娘里沒說,這個getchar()還是很快的呢,與它對應的還有一個putchar(),于是呢我們就可以用它來進行輸入輸出優化啦
(頭文件是cstdio)
isdigit是計算機C(C++)語言中的一個函數,主要用于檢查參數是否為十進制數字字符。用于判斷字符c是否為數字,當c為數字0~9時,返回非零值,否則返回零。 可以用一個字符數組循環判斷每一項是否為數字。
嗯,這個isdigit()能判斷一個字符是不是數字,好像很有用呢,那就當一個前置知識吧
(頭文件是cctype)
輸入輸出優化的簡單版
void read(int&x)//只能讀入非負整數 {char cu=getchar();x=0;//x置0,防止x有初始值while(!isdigit(cu))cu=getchar();while(isdigit(cu))x=x*10+cu-'0',cu=getchar(); } void read(int&x)//能讀入正、負整數和0 {char cu=getchar();x=0;bool fla=0;//記錄這個數是不是負數while(!isdigit(cu)){if(cu=='-')fla=1;cu=getchar();}while(isdigit(cu))x=x*10+cu-'0',cu=getchar();if(fla)x=-x; } //以上2個函數的用法為:對一個整型a,read(a)即可 void print(int x)//只能輸出非負整數 {if(x>=10)print(x/10);putchar(x%10+'0'); } void print(int x)//能輸出正、負整數和0 {if(x<0)x=-x,putchar('\n');if(x>=10)print(x/10);putchar(x%10+'0'); } //以上2個函數的用法為:對一個整型a,print(a)即可這樣你就會發現,你的輸入輸出快樂很多,如果算法相同,輸入輸出量較大,速度優勢會比較明顯呢。
嗯,好,如果你看懂了上面的代碼,那我就貼一波我自己用的代碼(加了一波優化,不要問我什么意思,有些關鍵詞如果不知道就自己去查吧)
溫馨提醒
使用這份輸入輸出代碼時請不要用它來讀入小數、字符串之類的(因為這份代碼是讀整型的啊),還有如果你不得已還要用其它的東西,那請你謹慎使用,因為這份讀優可能會吃掉你的下個字符(有可能是換行符)。當然你要是完全理解了,當然可以使用啦
輸入輸出優化的升級組件
哇用了讀優之后程序讀入的飛快呢對吧。
然后呢,我想告訴你的是,你還是會在輸入速度上被碾壓,為什么呢?因為還可以繼續優化哦
請看getchar()的函數內容
是不是有優化的空間呢,用fread,一次多讀一些東西就快了,自己實現,自然會比自帶的快呢(C++自帶的會因為考慮一些安全問題而變慢)
具體怎么優化呢?看下面
前面那一段要放在程序的最前面,然后還要說一件事,
#define getchar() getchar_()、
#define putchar(x) putchar_((x))
最好在自己調試的時候注釋掉,或者你用文件輸入輸出(freopen),否則你會發現你的程序會一直顯示等你輸入
update by 2019/1/2:其實還有個不用注釋掉的方法就是在輸入的最后輸入Ctrl+z然后Enter就可以了
總結
在C++中,輸入輸出有很多優化,這只是一種,但又很有效。不過呢,要用的話最好要自己理解,否則可能會出問題,幾個注意事項:
- namespace fast_IO 那一段要打在最前面
- read()、print()只能輸入輸出整數
- 用read()、print()的時候用其它輸入輸出方式(cin、cout、gets()、scanf、printf、puts())要謹慎使用,用namespace fast_IO的時候禁止使用其它輸入輸出方式
- 使用namespace fast_IO要注意內存問題,那里面有一個很大的char數組,小心MLE
最后貼出所有輸入輸出整合在一起的代碼
大家學一下輸入輸出優化,能讓自己的程序跑的更快哦
update by 2019/1/2:對讀優進行了部分壓行和更新,之前的那份的fread部分有小bug
總結
以上是生活随笔為你收集整理的C++输入、输出优化模板整理的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: NOIP2017提高组比赛总结
- 下一篇: mannachar(马拉车)求最长回文子