std::endl

using namespace std;することは避けるべきだとされる。

std::cout << '\n';std::cout << std::endl;という似たものがある。後者はstd::cout << '\n' << std::flush;と同じ意味になる。

LinuxWindowsでは改行コードが異なるが、そのためのものではない。std::cout << '\n';としても、コンパイルした環境の改行コードが適切に用いられる。つまりWindowsでは"\r\n"が出力される。Windowsで\nを出力したいときにはファイルをバイナリで開く。

std::endlを、'\n'くらいの意味だと思っていると、少し大きなデータをファイルに書き込んだりするときに、速度が無駄に大きく低下するなどする。一方で、デバッグのための出力などにも\nを汎用してしまうと、エラー終了する直前に書かれたはずのログが読めない。

思うに、任意のコードについて、エラー終了する可能性はある。よって、日頃からflushを最小限にしていると、bufferingについて捨象つまり忘れて考えたときに、デバッグ時間が(起きたバグの本質と関係がない下らない理由で)伸びる可能性がある。一方で、flushによる速度の低下が問題にならない場合が大半だろう。ただし、flushによる速度低下が問題になる場合も少なくはない。改行は、flushの粒度としては悪くない。まさに、std::endlの設計思想もそこにあるのだろう。よって、std::endlを用いることを原則として、必要な場合にはそれを避けるべきことに思い至れるべきだろうと思う。「遅いなあ」と思ったときに、「そういえばflush」と思えればいいのであって、「遅いなあ」と思わないときにflushまで最適化すべきではないだろう。

std::ios:sync_with_stdio(false);というものがある。C言語を使うときには(必然的に)printf()などのみを使い、C++言語を使うときにはstd::coutなどのストリームのみを使うべきだとされる。よって行儀よく使うなら、sync_with_stdio(true)されている必要はないと考えられる。しかしながらもう1点、スレッドセーフという効果もあるらしい(?)。ならばその意味で、sync_with_stdio(true)されているデフォルトの状態で使いつづける合理性があるだろう。

std::cin.tie(nullptr);というものがある。これは、cinが実行される前にはcoutがflushされ、coutが実行される前にはcinがflushされる、という機能をオフにするものらしい。プロンプトを表示しておいてからユーザのキーボード入力を受ける場合など、オンになっていたほうがいい場合が明らかに多くある。競技プログラミング以外では、オフにする必要はないだろう。

Donald Knuthによる格言、「Premature optimization is the root of all evil.」は、大切な真実だ。しかし、プログラミングの実行時間を最短にしようという興味は、C++に触れていくなら大切な気がする。そもそも、多くの問題についてはPythonのほうが遥かに生産性が高そうだ。よって、積極的にflushしたいときだけflushすべきだという考え方もできる。その場合、std::endlは使わず、\nとstd::flushを常に陽に分けて書くスタイルも有意義な気はする。