【C++】讀入優化&輸出優化
阿新 • • 發佈:2020-08-26
寫作原因
寫作原因?水部落格。
很簡單。因為作者NOIP學校考試愉快的寫崩了讀優,寫這篇部落格以示警惕。
讀入優化
讀入優化?這是一個神奇的東西。為什麼說它神奇呢? 請看對比圖:
對比圖
(注:最下面一個是用了fread的讀入優化)
附:test_io.in是一個從\(1\)~\(10^7\)的每一個數構成的輸入檔案。
程式碼
#define ONLINE_JUDGE #ifdef ONLINE_JUDGE char buf[1 << 21], *p1 = buf, *p2 = buf; inline int getc() { return p1 == p2 && (++p2 = (p1 = buf) + fread(buf, 1, 1 << 21, stdin), p1 == p2) ? EOF : *p1++; } #define getchar getc #endif template <typename T> inline T read() { T a = 0; char c = getchar(), f = 1; for(; c < '0' || c > '9'; c = getchar()) if(c == '-') f = -f; else if(c == -1) return -1; for(; c >= '0' && c <= '9'; c = getchar()) a = (a << 1) + (a << 3) + (c ^ 48); return a * f; }
首先,先來解讀read的部分。有關template的部分請查閱這篇部落格。
原理:getchar的速度比scanf快。
所以,我們可以按照讀入字串的形式來模仿讀入一個數。
完了…………
好再來看getc的部分(沒錯就是看,而不是理解)——沒什麼好理解的,就是背模板。
但是用了fread,就只能檔案輸入輸出,所以上面的#define ONLINE_JUDGE
就是拿來交在\(OJ\)上時用的,一般用小黑板測試時是註釋掉的。
那一句#define getchar getc
就是把後面的所有getchar當做getc來處理。
其它操作不會的就度娘吧……
天哪讀入優化竟然都有我自己造的板題……(其實不用fread
另外,這個程式碼當然不能用
read<double>
這種操作,因為double
是不支援位運算的。(話說位運算怎麼被我曠了)double
,因為在程式碼中沒有涉及小數和小數點另外說一句,洛谷上測竟然比我上面的自測時間短?!砸電腦。
而且——另外一個大佬那Copy來的表
有錘子嗎?借一個。
輸出優化
因為作者沒有寫崩輸出優化,所以輸出優化不是重點。
既然不是重點,那就直接給程式碼吧!
背程式碼就好了嘛。
template <typename T> inline void write(T x) { if(x < 0) x = (~x) + 1, putchar('-'); if(x / 10) write(x / 10); putchar(x % 10 | 48); }
懶得再去造題了。
話說fwrite到底怎麼用至今沒搞清楚
沒參考過的資料:淺談C++ IO優化——讀優輸優方法集錦洛穀日報