acm時加快cin和cout
阿新 • • 發佈:2020-08-27
在競賽中,遇到大資料時,往往讀檔案成了程式執行速度的瓶頸,需要更快的讀取方式。cin慢是有原因的,其實預設的時候,cin與stdin總是保持同步的,也就是說這兩種方法可以混用,而不必擔心檔案指標混亂,同時cout和stdout也一樣,兩者混用不會輸出順序錯亂。正因為這個相容性的特性,導致cin有許多額外的開銷,如何禁用這個特性呢?只需一個語句std::ios::sync_with_stdio(false);,這樣就可以取消cin於stdin的同步了。
在預設的情況下cin繫結的是cout,每次執行 << 操作符的時候都要呼叫flush,這樣會增加IO負擔。可以通過tie(0)(0表示NULL)來解除cin與cout的繫結,進一步加快執行效率。
缺點:關閉同步後,就不能cin和scanf混用了。
加上noi競賽常用的freopen,模板程式碼如下:
int main(){ freopen("data.in","r",stdin); freopen("data.out","w",stdout); ios::sync_with_stdio(false); cin.tie(0); ... ... }