1. 程式人生 > 實用技巧 >【C++】讀入優化&輸出優化

【C++】讀入優化&輸出優化

寫作原因

寫作原因?水部落格。
很簡單。因為作者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是不支援位運算的。(話說位運算怎麼被我曠了)Although你不用位運算也不能用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優化——讀優輸優方法集錦洛穀日報