std::ios::sync_with_stdio和tie()——給cin加速
阿新 • • 發佈:2018-10-31
平時在Leetcode上刷題的時候,總能看到有一些題中最快的程式碼都有這樣一段
static const auto init = []() {
std::ios::sync_with_stdio(false);
std::cin.tie(nullptr);
return nullptr;
}();
有時候偏偏演算法是一樣的,但是速度要比沒有這段程式碼的快很多;
查了一下這段程式碼其實是給cin加速的,也就是說上面提到的題應該是碰到的大資料的輸入,而cin cout要比scanf printf慢很多,很容易就time error了;
這應該也是一些acm dalao用printf scanf而不用cincout的原因吧;
具體是:
- C++為了讓cin cout和scanf printf 同時使用時不產生混亂,所以c++用一個緩衝區來同步c的標準流,
而std::ios::sync_with_stdio(false)可以關閉這一個同步,讓cin和cout不經過緩衝區; - tie()函式是把兩個stream繫結到一起,flush()是把緩衝區的資料輸出到檔案,而cin和cout是預設繫結在一起的,
每次使用都會呼叫flush(), 而cin.tie(nullptr)可以解除這個繫結; - cin和cout預設繫結在一起,是為了防止cin出現在cout之前,在繫結後,
每次cin都會先把緩衝區的資料重新整理到輸出檔案中;
今天也碰到了一個大資料輸入的題:
嘛,其實這裡主要是演算法的問題;
改進之後,這裡還沒用上述的程式碼:
使用之後:
還是有效果的;