cin.tie与sync_with_stdio加速I/O
以前總是聽說C++的cin、cout效率低下,導致我在做算法題的時候總是使用C風格的scanf、printf,敲起來真是麻煩得多2333
后來經過學習才發現,其實C++為了兼容C,而在i/o上做了一些文章,cin、cout經過手動配置,也能夠勝任在算法中的工作
std::cin做了額外的工作
cin之所以顯得慢,是因為出于安全考慮,做了以下兩個工作:
- 與 std::cout 綁定。每次 std::cin 從緩沖區讀入內容之前,會執行 std::cout.flush()刷新緩沖。
- 與 stdio 同步。確保混用 C 風格的 I/O 操作如(scanf,printf)不會引發問題。
而如果在編碼時能夠人為地避免這些問題,就可以省去這些工作,從而達到加速cin的目的。
std::cin.tie
cin.tie是將cin和某個ostream綁定的函數,空參數的話返回當前的輸出流指針。
根據 cplusplus網站 的描述,根據傳遞的參數不同,該函數具有兩種功能:
- (1)無參調用: ostream* tie() const;
- (2)含參調用: ostream* tie (ostream* tiestr);
The first form (1) returns a pointer to the tied output stream.
形式(1)返回當前綁定的輸出流指針
The second form (2) ties the object to tiestr and returns a pointer to the stream tied before the call, if any.
形式(2)將cin和tiestr綁定,并返回在這之前綁定的流指針(如果有的話)
The tied stream is an output stream object which is flushed before each i/o operation in this stream object.
綁定的流是一個輸出流對象,該對象在每次 i/o 操作之前都會進行刷新。
cplusplus網站還有一個代碼示例,為方便理解,在這里貼出我添加了注釋的版本:
// redefine tied object #include <iostream> // std::ostream, std::cout, std::cin #include <fstream> // std::ofstreamint main() {std::ostream* prevstr;std::ofstream ofs;// ofs 綁定文件 test.txtofs.open("test.txt");// 控制臺輸出std::cout << "tie example:\n";// cin.tie 返回 std::cout 的指針,字符串輸出到控制臺*std::cin.tie() << "This is inserted into cout";// 將文件輸出流 ofs 綁定在 std::cin 上// 同時返回原先綁定在cin上的輸出流指針(指向控制臺輸出)prevstr = std::cin.tie(&ofs);// cin.tie 返回 ofs 的指針,字符串輸出到文件 test.txt*std::cin.tie() << "This is inserted into the file";// 恢復為控制臺輸出std::cin.tie(prevstr);// 關閉文件ofs.close();return 0; }利用形式(2),在默認狀態下,我們可以通過給該函數傳遞空指針,從而解除cin與cout的綁定,省去了第一項額外工作的時間,具體代碼如下:
std::cin.tie(nullptr); //或者std::cin.tie(0);ios::sync_with_stdio
調用該函數可以切換C++流和C流的同步狀態
它的原型是:
這個同步是默認打開的,所以在默認情況下 C++ 流上做的操作會被同步到相應的 C 流中,這就為混和使用C++流和C流提供了可能。
倘若我們不混和使用C++流和C流(就比如在做算法題的時候),我們可以通過向該函數傳遞false參數值,以解除 C++ 流與 C 流的同步:
std::ios::sync_with_stdio(false);這樣一來第二項額外工作也免了。
所以,通過調用這兩個函數,我們可以放心地將算法的I/O交給cin和cout處理,不用擔心因為它們而TLE了
#include <iostream>int main(){std::cin.tie(nullptr);std::ios::sync_with_stdio(false);// 然后寫你的代碼去吧... }總結
以上是生活随笔為你收集整理的cin.tie与sync_with_stdio加速I/O的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: LiveRTMP内置IPCamera实现
- 下一篇: 计算机程序概念内涵,算法的概念的教学设计