1. 程式人生 > 實用技巧 >acm時加快cin和cout

acm時加快cin和cout

在競賽中,遇到大資料時,往往讀檔案成了程式執行速度的瓶頸,需要更快的讀取方式。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);
    ...
    ...
}