一、前言
之前寫題遇到大數據量(cin、cout 數據量級達到 1e5、1e6 ),因為考慮 IO 性能報錯 TLE,故選擇 scanf、printf 替代 cin、cout,以解決問題。一直以來沒有深入研究其中原因,只知關鍵詞——同步,雖是本質但差之千里,今究其因,記錄本文。
二、ios::sync_with_stdio(false)
在調用 ios::sync_with_stdio(false) 后,cout 與 stdout 不再共享同一塊緩沖區,它們分別管理自己的緩沖區。簡述,函數作用為設置標準 C++ 流是否與標準 C 流在每次輸入/輸出操作后同步
正是因為這種同步,所以 cin、cout 比 scanf、printf 速度要慢,如果我們在使用 cin、cout 輸入輸出前加一句 ios::sync_with_stdio(false),即取消緩沖區同步,可節省時間,效率與 scanf、printf 相差無幾。
三、cin.tie(nullptr)
tie 是一個函數,將兩個 stream 綁定,空指針的話返回當前輸出流指針
cin 默認是與 cout 綁定,所以每次 cin 操作的時候都在聯系流(即輸出流)調用 flush(),這樣增加了 IO 負擔,通過 cin.tie(nullptr) 來解除 cin 和 cout 之間的綁定,進一步加快執行效率。