web-dev-qa-db-ja.com

<includes <bits / stdc ++。h>を#includeしないのはなぜですか?

#includeディレクティブのみが次のコードで質問を投稿しました。

#include <bits/stdc++.h>

私の先生はこれをするように私に言ったが、コメントのセクションで私はすべきではないと知らされた。

どうして?

<bits/stdc++.h>を含めることは、おそらく現在の学年の国家カリキュラムに新たに追加されたスタックオーバーフローで見られるようになりつつあるようです。

このように、利点が漠然と与えられていると思います。

  • 必要な#include行は1行だけです
  • すべてが含まれている標準ヘッダーを調べる必要はありません

残念ながら、これは遅延ハックであり、<string><iostream><vector>などの個々の標準ヘッダーの代わりにGCC内部ヘッダーに直接名前を付けます。移植性を損ない、ひどい習慣を助長します。

欠点は次のとおりです。

  • おそらくそのコンパイラでのみ動作します
  • その内容は標準によって設定されていないため、使用するときに何をするかわかりません
  • コンパイラを次のバージョンにアップグレードするだけでもプログラムが壊れる可能性があります
  • すべての単一標準ヘッダーをソースコードと共に解析およびコンパイルする必要があります。これは時間がかかり、特定のコンパイル設定ではかさばる実行可能ファイルになります。

しないでください!


詳しくは:

Quoraが悪い理由の例:

どうして? C++標準ヘッダーであるかのように使用されますが、標準に言及されていないためです。そのため、コードは構造上移植性がありません。 cppreference にはドキュメントがありません。したがって、存在しない可能性もあります。それは誰かの想像力の産物です:)

26
Kuba Ober

Programming Puzzles&Code Golf と呼ばれるStack Exchangeサイトがあります。そのサイトのプログラミングパズルは、 puzzle のこの定義に当てはまります。「おもちゃ、問題、または創意工夫または忍耐強い努力によって解決される困難を提示します。」彼らは楽しませるように設計されており、日常の仕事で実際の問題に遭遇することで働くプログラマーを面白がらせるような方法ではありません。

Code Golf は「参加者が特定のアルゴリズムを実装する可能な限り最短のソースコードを達成するように努める娯楽用コンピュータープログラミング競技会の一種」です。 PP&CGサイトの回答では、回答のバイト数を指定していることがわかります。数バイトを削る方法を見つけると、元の番号を取り出して新しい番号を記録します。

ご想像のとおり、コードゴルフは極端なプログラミング言語の乱用に報います。 1文字の変数名。空白なし。ライブラリ関数の創造的な使用。文書化されていない機能。非標準のプログラミング慣行。恐ろしいハッキング。

プログラマーが職場でゴルフスタイルのコードを含むプルリクエストを送信した場合、拒否されます。彼らの同僚は彼らを笑います。マネージャーはチャットのために机に立ち寄ります。それでも、プログラマーはPP&CGに回答を送信することで楽しんでいます。

これはstdc ++。hと何の関係がありますか?他の人が指摘しているように、それを使うのは面倒です。移植性がないため、コンパイラーまたはコンパイラーの次のバージョンで動作するかどうかはわかりません。それは悪い習慣を助長します。これは非標準であるため、プログラムの動作は予想と異なる場合があります。コンパイル時間と実行可能ファイルのサイズが増加する場合があります。

これらはすべて有効かつ正しい反対です。それでは、なぜ誰もがこの怪物を使うのでしょうか?

一部の人々は、プログラミングパズルが好きで、code golfがありません。彼らは集まり、ACM-ICPC、Google Code Jam、Facebook Hacker Cupなどのイベント、またはTopcoderやCodeforcesなどのサイトで競います。それらのランクは、プログラムの正確性、実行速度、およびソリューションを送信する速度に基づいています。実行速度を最大化するために、多くの参加者はC++を使用します。コーディング速度を最大化するために、それらの一部はstdc ++。hを使用します。

これは良いアイデアですか?欠点のリストを確認しましょう。移植性?これらのコーディングイベントは、競技者が事前に知っている特定のコンパイラバージョンを使用するため、重要ではありません。標準への準拠?耐用年数が1時間未満のコードブロックには関係ありません。コンパイル時間と実行可能ファイルサイズは?これらは、コンテストの採点基準の一部ではありません。

だから私たちには悪い習慣が残っています。これは有効な異論です。このヘッダーファイルを使用することにより、競技者は、プログラムで使用している機能を定義している標準ヘッダーファイルを知る機会を避けています。 (stdc ++。hを使用せずに)実際のコードを作成する場合、この情報の検索に時間を費やす必要があり、生産性が低下します。それは、stdc ++。hで練習することの欠点です。

これは、stdc ++。hの使用や他のコーディング標準への違反などの悪い習慣を助長する場合、なぜ競合プログラミングに参加する価値があるのか​​という疑問を提起します。答えの1つは、PP&CGにプログラムを投稿するのと同じ理由でそれを行うということです。一部のプログラマーは、ゲームのようなコンテキストでコーディングスキルを使用するのが楽しいと感じています。

そのため、stdc ++。hを使用するかどうかの問題は、プログラミングコンテストでコーディング速度の利点が、それを使用して開発する可能性のある悪い習慣を上回るかどうかにかかっています。

この質問は、「なぜ#include <bits/stdc++.h>しないのですか?」私はそれが要点を述べるように求められ、答えられたことを理解し、受け入れられた答えはこの質問に対する唯一の真の答えであることを意図しています。しかし、問題は「なぜ本番コードに<bits/stdc++.h>を含めるべきではないのですか?」ではありません。したがって、答えが異なる可能性がある他のシナリオを検討することは合理的だと思います。

11
RedGreenCode