1. 程式人生 > >std::ios::sync_with_stdio和tie()——給cin加速

std::ios::sync_with_stdio和tie()——給cin加速

平時在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的原因吧;

 

具體是:

  1. C++為了讓cin cout和scanf printf 同時使用時不產生混亂,所以c++用一個緩衝區來同步c的標準流,
    而std::ios::sync_with_stdio(false)可以關閉這一個同步,讓cin和cout不經過緩衝區;
  2. tie()函式是把兩個stream繫結到一起,flush()是把緩衝區的資料輸出到檔案,而cin和cout是預設繫結在一起的,
    每次使用都會呼叫flush(), 而cin.tie(nullptr)可以解除這個繫結;
  3. cin和cout預設繫結在一起,是為了防止cin出現在cout之前,在繫結後,

    每次cin都會先把緩衝區的資料重新整理到輸出檔案中

 

 

 

今天也碰到了一個大資料輸入的題:

 

 

嘛,其實這裡主要是演算法的問題;

 

改進之後,這裡還沒用上述的程式碼:

 

 

使用之後:

 

還是有效果的;