📘
std::ios_base::sync_with_stdio(false); std::cin.tie(nullptr); の意味
AtCoderなどのプログラミングコンテストで、標準入出力の高速化の目的で使われています。
このおまじないについて解説します。
std::ios_base::sync_with_stdio
std::cin.tie
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
std::cin.tie(nullptr)
std::cinから読み込む場合は、std::coutをフラッシュして、コンソールに表示します。
tieはストリームを結びつける関数で、nullptrを設定すると、結びつけがなくなるので、フラッシュの操作がなくなります。
フラッシュがなくなる分だけ処理が早くなります。
結論
まとめると以下のようになります。
-
std::ios_base::sync_with_stdio(false)はC++とCの標準ストリームの同期をやめることで高速化
-
std::cin.tie(nullptr)は、フラッシュを減らして高速化
Discussion