AtCoderなどのプログラミングコンテストで、標準入出力の高速化の目的で使われています。
このおまじないについて解説します。
この記事は以下を参考にしています。
リンク
目次
std::ios_base::sync_with_stdio(false)
標準C++ストリーム(std::cin,std::coutなど)と標準Cストリーム(stdin,stdout,stdeer)の同期をやめます。
デフォルトはtrueで同期しています。
同期をやめることで、C++ 標準ストリームは入出力を独立してバッファリングできるようになり、場合によっては速くなることがあります。
#include <iostream>
#include <cstdio>
int main()
{
std::ios::sync_with_stdio(false);
std::cout << "A\n";
std::printf("B\n");
std::cout << "C\n";
}
順番が保証されなくなります。
※ただし、必ずこうなるというわけではありません。
A
C
B
注意
- C++とCの標準ストリームを混在させない
- C++をスレッドで使用しない
同期をオフにするとこでスレッドセーフが保証されない
std::cin.tie(nullptr)
std::cinから読み込む場合は、std::coutをフラッシュして、コンソールに表示します。
tieはストリームを結びつける関数で、nullptrを設定すると、結びつけがなくなるので、フラッシュの操作がなくなります。
フラッシュがなくなる分だけ処理が早くなります。
結論
まとめると以下のようになります。
- std::ios_base::sync_with_stdio(false)はC++とCの標準ストリームの同期をやめることで高速化
- std::cin.tie(nullptr)は、フラッシュを減らして高速化
コメント