web-dev-qa-db-ja.com

#include <bits / stdc ++。h>はC ++でどのように機能しますか?

codeforces ブログを読んだことがありますが、#include <bits/stdc++.h>プログラムでC++を使用する場合は、他のヘッダーファイルをインクルードする必要はありません。 #include <bits/stdc++.h>はどのように機能しますか?個々のヘッダファイルをインクルードする代わりにそれを使用しても大丈夫ですか?

99
JerryGoyal

これは基本的にすべての標準ライブラリとstlインクルードファイルを含むヘッダファイルです。私がそれのために見ることができる唯一の目的はテストと教育のためでしょう。

例えば。 GCC 4.8.0 /bits/stdc++.hソース

それを使うことは多くの不必要なものを含み、コンパイル時間を増やします。

編集:ニールが言うように、それはプリコンパイルされたヘッダのための実装です。プリコンパイル用に正しく設定すると、実際のプロジェクトによってはコンパイル時間が短縮される可能性があります。 ( https://gcc.gnu.org/onlinedocs/gcc/Precompiled-Headers.html

しかしながら、私はあなたがsl/stlヘッダのそれぞれについて学び、代わりにそれらを別々にインクルードするのに時間がかかることをお勧めします、そしてプリコンパイルの目的を除いて "superheaders"を使用しないでください。

97
Zelix

#include <bits/stdc++.h>は、プリコンパイル済みヘッダーの実装ファイルです。

ソフトウェアエンジニアリングの観点からは、インクルードを最小限に抑えることをお勧めします。実際に使用すると、プログラムには不要なファイルが多数含まれるため、コンパイル時間とプログラムサイズの両方が不必要に増加します。 [編集:出力プログラムのサイズは影響を受けないままであるというコメントで@Swordfishが指摘したように。それでも、競争上の競争がない限り、実際に必要なライブラリだけを含めることをお勧めします。]

しかし、コンテストでは、このファイルを使用することは雑用をするのに浪費される時間を減らしたいときには、良い考えです。特にあなたのランクが時間に敏感なとき。

ほとんどのオンライン審査員、ACM-ICPC(準地域大会、地域大会、および世界大会)を含むプログラミングコンテスト環境、および多くのオンライン審査員で動作します。

それの不利な点はそれです

  • コンパイル時間が長くなります。
  • GNU C++ライブラリの内部非標準ヘッダファイルを使用するため、MSVC、XCode、およびその他の多くのコンパイラではコンパイルされません。
30
abe312

そのヘッダファイルはC++標準の一部ではないため、移植性がないので避けるべきです。

さらに、標準でキャッチオールヘッダがあったとしても、コンパイラは実際にすべてのインクルードヘッダ(再帰的にインクルードされたヘッダを含む)を読み込んで解析しなければならないので、特定のヘッダの代わりにそれを避けたいと思うでしょう。翻訳単位がコンパイルされます。

それは基本的にすべての標準ライブラリを含むヘッダファイルです。プログラミングコンテストでは、このファイルを使うことは雑用をするのに浪費される時間を減らしたいときに、良い考えです。特にあなたのランクが時間に敏感なとき。プログラミングコンテストでは、人々はソフトウェア工学よりも問題を解決するためのアルゴリズムを見つけることにもっと集中します。ソフトウェアエンジニアリングの観点からは、インクルードを最小限に抑えることをお勧めします。あなたがそれを使用する場合、実際にはあなたのプログラムが必要としないかもしれないたくさんのファイルを含んでいるので、コンパイル時間とプログラムサイズの両方を不必要に増加させます。

詳しくはこちらをご覧ください https://www.geeksforgeeks.org/bitsstdc-h-c/

これは、ランクが重要となるオンラインコーディングに最適です。

3
Vivek Ghanchi

残念ながら、そのアプローチは移植可能なC++ではありません(これまで)。

すべての標準名は名前空間stdにあり、さらにどの名前がではなく includeおよびheaderで定義されているかを知ることはできません(言い換えると、実装が名前std::stringを直接宣言することは完全に合法ですまたは#include <vector>を使用する場合は間接的に)。

しかし、それにもかかわらず、どの標準ヘッダーに標準ライブラリのどの部分が含まれているかを、言語がコンパイラに認識して伝える必要があります。これは移植性のバグの原因です。たとえば、#include <map>を忘れてstd::mapを使用すると、特定のコンパイラの特定のバージョンで警告なしにプログラムが静かにコンパイルされる可能性があり、後で別のコンパイラに移植するか、バージョン。

私の意見では、これは一般的なユーザーに必要なため、有効な技術的な言い訳はありません:コンパイラバイナリにはすべての標準名前空間を組み込むことができ、これにより実際にプリコンパイル済みヘッダーよりもパフォーマンスを向上させることができますヘッダーの解析またはロード/デマーシャリングなど)。

標準ヘッダーを使用すると、コンパイラまたは標準ライブラリを作成する人の生活が簡素化され、それだけです。ユーザーを支援するものではありません。

しかし、これは言語の定義方法であり、どのヘッダーがどの名前を定義するかを知る必要があるので、いくつかの余分なニューロンを無意味な構成で焼いて、それを覚えてください(または自動的に追加するIDEを見つけようとする使用する標準ヘッダーと、使用しないヘッダーを削除します...合理的な代替手段)。

1
6502

それは基本的にすべての標準ライブラリを含むヘッダファイルです。
プログラミングコンテストでは、雑用をするのに浪費される時間を減らしたい場合は、このファイルを使用することをお勧めします。特にあなたのランクが時間に敏感なとき。
プログラミングコンテストでは、人々はソフトウェア工学よりも問題を解決するためのアルゴリズムを見つけることにもっと集中しています。
しかし、ソフトウェア工学の観点では、使用するのはお勧めできません。実際に使用すると、プログラムには必要のない多くのファイルが含まれるため、コンパイル時間とプログラムサイズの両方が不必要に増加します。

1
Linkon