大家都知道c++兼容完整的c,從理論上來講cin和cout的速度應該遠遠大於c中scanf和printf。
但是在真真做題的時候,當數據輸入次數足夠多的時候,用cin/cout的會超,而用scanf/printf則能過題,這是為什么?
1.結論:
默認情況,cin與stdin總是保持同步的,也就是說這兩種方法可以混用,而不必擔心文件指針混亂,同時cout和stdout也一樣,兩者混用不會輸 出順序錯亂。正因為這個兼容性的特性,導致cin有許多額外的開銷,如何禁用這個特性呢?只需一個語句 std::ios::sync_with_stdio(false);,這樣就可以取消cin於stdin的同步了,此時的cin就與scanf差不多 了。
另一種解釋: cout在輸出時總是要先將輸出的存入緩存區。而printf直接調用系統進行IO,它是非緩存的。所以cout比printf慢。
sync_with_stdio
這個函數是一個“是否兼容stdio”的開關,C++為了兼容C,保證程序在使用了std::printf和std::cout的時候不發生混亂,將輸出流綁到了一起。
tie
tie是將兩個stream綁定的函數,空參數的話返回當前的輸出流指針。
解決cin慢的辦法:在輸入前加入如下三行代碼即可。
int main() { ios::sync_with_stdio(false);//關閉c++兼容c的特性 cin.tie(0);//加速cin cout.tie(0);//加速cout return 0; }
2.有些毒瘤出題人,會卡scanf的時間,也就是說要另尋更快的輸入。---->getchar() 輸入中的邪教
借鑒博客:https://blog.csdn.net/qq_34287501/article/details/70232038
整數:
inline bool scan_d(int &num) { char in;bool IsN=false; in=getchar(); if(in==EOF) return false; while(in!='-'&&(in<'0'||in>'9')) in=getchar(); if(in=='-'){ IsN=true;num=0;} else num=in-'0'; while(in=getchar(),in>='0'&&in<='9'){ num*=10,num+=in-'0'; } if(IsN) num=-num; return true; }
浮點數:
inline bool scan_lf(double &num) { char in;double Dec=0.1; bool IsN=false,IsD=false; in=getchar(); if(in==EOF) return false; while(in!='-'&&in!='.'&&(in<'0'||in>'9')) in=getchar(); if(in=='-'){IsN=true;num=0;} else if(in=='.'){IsD=true;num=0;} else num=in-'0'; if(!IsD){ while(in=getchar(),in>='0'&&in<='9'){ num*=10;num+=in-'0';} } if(in!='.'){ if(IsN) num=-num; return true; }else{ while(in=getchar(),in>='0'&&in<='9'){ num+=Dec*(in-'0');Dec*=0.1; } } if(IsN) num=-num; return true; }
強烈輸入掛(直接交,看結果需要用文件):
#define FI(n) FastIO::read(n) namespace FastIO { const int SIZE = 1 << 16; char buf[SIZE], obuf[SIZE], str[60]; int bi = SIZE, bn = SIZE, opt; int read(char *s) { while (bn) { for (; bi < bn && buf[bi] <= ' '; bi++); if (bi < bn) break; bn = fread(buf, 1, SIZE, stdin); bi = 0; } int sn = 0; while (bn) { for (; bi < bn && buf[bi] > ' '; bi++) s[sn++] = buf[bi]; if (bi < bn) break; bn = fread(buf, 1, SIZE, stdin); bi = 0; } s[sn] = 0; return sn; } bool read(int& x) { int n = read(str), bf; if (!n) return 0; int i = 0; if (str[i] == '-') bf = -1, i++; else bf = 1; for (x = 0; i < n; i++) x = x * 10 + str[i] - '0'; if (bf < 0) x = -x; return 1; } };