使用std::ios::tie與std::ios_base::sync_with_stdio加速流

1. std::ios_base::sync_with_stdio
ios

static bool sync_with_stdio( bool sync = true );  

  與cstdio流[靜態]切換同步c++

    打開或關閉全部的標準iostream流與它們對於的標準C流之間的同步。算法

    實際上,這意味着C++和C流使用相同的緩衝區,所以,能夠自由地混合使用流。同步C++標準流能夠確保線程安全。
安全

    默認狀況下,iostream對象和cstdio流同步。若是同步關閉,C++標準流獨立地緩衝輸入輸出,在某些狀況下,這是至關快速的。測試

  參數spa

    syn線程

    用於指示是否同步的布爾值,值爲true開啓同步,爲false時關閉同步。c++11

  返回值code

    返回被調用以前的同步狀態。當它第一次被調用,老是返回true。對象


  使用樣例

#include <iostream>
#include <cstdio>
 
int main()
{
    std::cout.sync_with_stdio(false);
    std::cout << "a\n";
    std::printf("b\n");
    std::cout << "c\n";
}

   程序輸出

b
a
c

 

 

2. std::ios::tie

    在默認的狀況下cin綁定的是cout,c++11中cin和cerr都默認和cin綁定。

 

 

3.

1. 算法競賽中,關閉iostream對象和cstdio流同步以提升輸入輸出的效率。

    即調用ios::sync_with_studio(false);    !特別注意:關閉後C++ IO與C IO不能混用,cin不能與scanf,sscanf, getchar, fgets等混用,cout不能與printf,puts等混用,不然IO會混亂。

2. 在默認的狀況下cin綁定的是cout,每次執行 << 操做符的時候都要調用flush,這樣會增長IO負擔。能夠經過tie(0)(0表示NULL)來解除cin與cout的綁定,進一步加快執行效率。              即調用std::cin.tie(0);

1     #include <iostream>
2     int main() 
3     {
4         std::ios::sync_with_stdio(false);
5         std::cin.tie(0);
6         // 下面進行IO
7     }

 

可參見BYVoid的博客的詳細測試: https://www.byvoid.com/blog/fast-readfile/

 

 

4. 其它加速方法

    使用'\n'或者"\n"代替endl。即便用cout<<'\n';和cout<<"\n";

相關文章
相關標籤/搜索