Skip to content

[C++] 程式競賽中的 ios_base::sync_with_stdio(false) 和 cin.tie(NULL) 的意義

Last Updated on 2023-12-29 by Clay

解釋

在如 LeetCode 這種刷題平台上,若是在解題後會去看大神們的解題思路,那總少不得會看到一組神奇的程式碼(C++ only):

ios_base::sync_with_stdio(false);
cin.tie(NULL);


這兩行明明與解題無關、為什麼會出現在答題的程式碼中呢?答案很簡單:為了速度

在C++中,標準函式庫提供了兩套輸入輸出(I/O)系統:

  1. C語言風格的stdio(例如 printfscanf
  2. C++風格的iostream(例如 cincout )。

這兩套 I/O 系統在預設情況下是同步的,意思是我們可以在同一份程式碼中混合使用它們而不會產生輸出順序混亂。

然而,雖然這樣保證了能夠同時工作,但這會影響程式碼的效能,尤其是當我們進行大量 I/O 操作時,系統都需要執行額外的步驟來持續維持同步。

所以在像是程式競賽、或大量 I/O 操作的程式中,開發者通常都會通過調用 ios_base::sync_with_stdio(false) 來讓 C++ 標準函式庫取消 iostream 和 stdio 之間的同步,從而減少了 I/O 操作的開銷。

這通常會導致顯著的效能提升。


References


Read More

Tags:

Leave a Reply取消回覆

Exit mobile version