📘

std::ios_base::sync_with_stdio(false); std::cin.tie(nullptr); の意味

2024/04/15に公開

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