日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

cin.tie与sync_with_stdio加速I/O

發布時間:2024/3/12 编程问答 46 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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流的同步狀態
它的原型是:

static bool sync_with_stdio( bool sync = true )

這個同步是默認打開的,所以在默認情況下 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的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。