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

301
Lightness Races in Orbit 2015-08-05 07:57.

私は自分のコードで質問を投稿しました#includeが、その唯一の指示は次のとおりです。

#include <bits/stdc++.h>

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

どうして?

5 answers

349
Lightness Races in Orbit 2015-08-05 07:57.

含める<bits/stdc++.h>ことは、Stack Overflowで見られることがますます一般的になっているように見えます。おそらく、現在の学年度に国のカリキュラムに新たに追加されたものです。

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

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

残念ながら、これは代わりのように、個々の標準ヘッダーの直接GCC内部ヘッダを命名、怠惰なハックです<string><iostream><vector>。それは携帯性を台無しにし、ひどい習慣を助長します。

欠点は次のとおりです。

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

しないでください!


詳しくは:

Quoraが悪い理由の例:

67
Unslander Monica 2015-08-07 06:50.

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

私は、恐ろしくて信じられないことに、すべてのC ++の例にこのヘッダーが含まれているように見える有名なチュートリアルサイトがあることを発見しました。世界は怒っています。それがその証拠です。


そのような「チュートリアル」を書いている人には

このヘッダーの使用を停止してください。気にしないで。この狂気を広めないでください。これを行うことが間違っている理由を理解したくない場合は、私の言葉を信じてください。私は何かの権威者として扱われるのはまったくOKではなく、おそらく半分の時間でそれでいっぱいですが、この1つの場合にのみ例外を設けます。私はここで私が話していることを知っていると主張します。私の言葉を信じてください。私はあなたに懇願します。

PSこの邪悪な考えが起こったかもしれない忌まわしい「教育基準」と、それをもたらした状況はよく想像できます。それが実際に必要であると思われたからといって、それが受け入れられるわけではありません-振り返ってみても。

PPSいいえ、実際には必要ありませんでした。C ++標準ヘッダーはそれほど多くなく、十分に文書化されています。あなたが教えるなら、あなたはそのような「魔法」を加えることによってあなたの学生に不利益を与えています。魔法のような考え方でプログラマーを生み出すことは、私たちが望んでいる最後のことです。学生の生活を楽にするためにC ++のサブセットを学生に提供する必要がある場合は、教えるコースに適用できるヘッダーの短いリストと、学生が使用することを期待するライブラリ構造の簡潔なドキュメントを含む配布資料を作成するだけです。

45
RedGreenCode 2019-04-23 15:09.

プログラミングパズルとコードゴルフと呼ばれるStackExchangeサイトがあります。そのサイトのプログラミングパズルは、このパズルの定義に適合しています。

創意工夫や忍耐強い努力によって解決されるべき困難を提示することによって楽しませるために設計されたおもちゃ、問題、または他の工夫。

それらは面白くするように設計されており、作業中のプログラマーが日常業務で遭遇する現実の問題に面白がるような方法ではありません。

コードゴルフは、「参加者が特定のアルゴリズムを実装する最短のソースコードを達成するために努力する一種のレクリエーションコンピュータプログラミングコンテスト」です。PP&CGサイトの回答では、回答のバイト数を指定している人がいます。数バイトを削る方法を見つけたら、元の番号を削除して新しい番号を記録します。

ご想像のとおり、コードゴルフはプログラミング言語の極端な乱用に報います。1文字の変数名。空白はありません。ライブラリ関数の創造的な使用。文書化されていない機能。非標準のプログラミング手法。ぞっとするようなハック。

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

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

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

コードゴルフなしでパズルプログラミングするのが好きな人もいることがわかりました。彼らは集まって、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>本番コードに#includeしないのか」ではありません。したがって、答えが異なる可能性がある他のシナリオを検討することは合理的だと思います。

12
Bulletmagnet 2019-11-04 01:39.

N4606、ワーキングドラフト、プログラミング言語C ++の標準から:

17.6.1.2ヘッダー[ヘッダー]

  1. C ++標準ライブラリの各要素は、ヘッダーで(必要に応じて)宣言または定義されます。

  2. C ++標準ライブラリは、表14に示すように、61個のC ++ライブラリヘッダーを提供します。

表14— C ++ライブラリヘッダー

<algorithm> <future> <numeric> <strstream>
<any> <initializer_list> <optional> <system_error>
<array> <iomanip> <ostream> <thread>
<atomic> <ios> <queue> <tuple>
<bitset> <iosfwd> <random> <type_traits>
<chrono> <iostream> <ratio> <typeindex>
<codecvt> <istream> <regex> <typeinfo>
<complex> <iterator> <scoped_allocator> <unordered_map>
<condition_variable> <limits> <set> <unordered_set>
<deque> <list> <shared_mutex> <utility>
<exception> <locale> <sstream> <valarray>
<execution> <map> <stack> <variant>
<filesystem> <memory> <stdexcept> <vector>
<forward_list> <memory_resorce> <streambuf>
<fstream> <mutex> <string>
<functional> <new> <string_view>

<bits / stdc ++。h>はありません。<bits / ...>ヘッダーは実装の詳細であり、通常は警告が表示されるため、これは驚くべきことではありません。

*  This is an internal header file, included by other library headers.
*  Do not attempt to use it directly. 

<bits / stdc ++。h>にも警告があります。

*  This is an implementation file for a precompiled header.
2
Yunfei Chen 2020-07-08 14:20.

使用しない理由:

#include <bits/stdc++.h>

効率のためです。例えを挙げましょう。Javaを知っている人のために:あなたがインストラクターに次のことが良い考えであるかどうか尋ねた場合、彼らが悪いインストラクターでない限り、彼らはノーと言うでしょう:

import java.*.*

#include ...は、基本的に同じことを行います...それを使用しない理由はそれだけではありませんが、使用しない主な理由の1つです。実際の例えとして、図書館があり、図書館から数冊の本を借りたいとしたら、図書館全体を家の隣に移しますか?それは高価で非効率的です。必要な本が5冊だけの場合は、5冊だけ取り出してください...ライブラリ全体ではありません.....

#include <bits/stdc++.h>

プログラムの外観に便利に見えます。includeステートメントを1つ入力するだけで機能します。ライブラリ全体を移動する場合と同じように、5冊の本ではなくライブラリ全体を1つずつ移動するだけで済みます。それは、実際に引っ越しをしなければならない人にとって、あなたにとって便利に見えますか?それほど多くはありません。C++では、移動を行う人があなたのコンピュータになると思います...コンピュータは、あなたが書いたすべてのソースファイルのライブラリ全体を移動することを楽しんでいません:)....。

Related questions

MORE COOL STUFF

「水曜日」シーズン1の中心には大きなミステリーがあります

「水曜日」シーズン1の中心には大きなミステリーがあります

Netflixの「水曜日」は、典型的な10代のドラマ以上のものであり、実際、シーズン1にはその中心に大きなミステリーがあります.

ボディーランゲージの専門家は、州訪問中にカミラ・パーカー・ボウルズが輝くことを可能にした微妙なケイト・ミドルトンの動きを指摘しています

ボディーランゲージの専門家は、州訪問中にカミラ・パーカー・ボウルズが輝くことを可能にした微妙なケイト・ミドルトンの動きを指摘しています

ケイト・ミドルトンは、州の夕食会と州の訪問中にカミラ・パーカー・ボウルズからスポットライトを奪いたくなかった、と専門家は言う.

一部のファンがハリー・スタイルズとオリビア・ワイルドの「非常に友好的な」休憩が永続的であることを望んでいる理由

一部のファンがハリー・スタイルズとオリビア・ワイルドの「非常に友好的な」休憩が永続的であることを望んでいる理由

一部のファンが、オリビア・ワイルドが彼女とハリー・スタイルズとの間の「難しい」が「非常に友好的」な分割を恒久的にすることを望んでいる理由を見つけてください.

エリザベス女王の死後、ケイト・ミドルトンはまだ「非常に困難な時期」を過ごしている、と王室の専門家が明らかにする 

エリザベス女王の死後、ケイト・ミドルトンはまだ「非常に困難な時期」を過ごしている、と王室の専門家が明らかにする&nbsp;

エリザベス女王の死後、ケイト・ミドルトンが舞台裏で「非常に困難な時期」を過ごしていたと伝えられている理由を調べてください.

セントヘレナのジェイコブのはしごを登るのは、気弱な人向けではありません

セントヘレナのジェイコブのはしごを登るのは、気弱な人向けではありません

セント ヘレナ島のジェイコブズ ラダーは 699 段の真っ直ぐ上る階段で、頂上に到達すると証明書が発行されるほどの難易度です。

The Secrets of Airline Travel Quiz

The Secrets of Airline Travel Quiz

Air travel is far more than getting from point A to point B safely. How much do you know about the million little details that go into flying on airplanes?

Where in the World Are You? Take our GeoGuesser Quiz

Where in the World Are You? Take our GeoGuesser Quiz

The world is a huge place, yet some GeoGuessr players know locations in mere seconds. Are you one of GeoGuessr's gifted elite? Take our quiz to find out!

バイオニック読書はあなたをより速く読むことができますか?

バイオニック読書はあなたをより速く読むことができますか?

BionicReadingアプリの人気が爆発的に高まっています。しかし、それは本当にあなたを速読術にすることができますか?

Total War:Warhammer:Kotakuレビュー

Total War:Warhammer:Kotakuレビュー

私はこのゲームを嫌う準備ができていました。先週の前に、Total War:Warhammerについての私の考えがありました:それでもここに私は、私の手にある完成品であり、私は変わった男です。

涙の道:軍事化された帝国主義勢力がスタンディングロックキャンプを占領

涙の道:軍事化された帝国主義勢力がスタンディングロックキャンプを占領

スタンディングロックスー族のメンバーと水の保護者は、ノースダコタ州のスタンディングロックにあるオセティサコウィンキャンプを去ります。(Twitter経由のCNNスクリーンショット)火と煙がスカイラインを覆い、スタンディングロックスー族のメンバーと水の保護者が、聖なるものを守りながら建てた家、オセティサコウィン(セブンカウンシルファイアーズ)キャンプから行進し、太鼓を打ち、歌い、祈りました。ダコタアクセスパイプラインとしても知られる「ブラックスネーク」からの土地。

シアーズとKマートはイヴァンカ・トランプの商品を自分たちで取り除いています

シアーズとKマートはイヴァンカ・トランプの商品を自分たちで取り除いています

写真:APシアーズとKマートは、イヴァンカ・トランプのトランプホームアイテムのコレクションも、誰も購入したくないために削除しました。シアーズとKマートの両方の親会社であるシアーズホールディングスは、土曜日のABCニュースへの声明で、彼らが気にかけていると辛抱強く説明しましたトランプラインを売り続けるにはお金を稼ぐことについてあまりにも多く。

ポテトチップスでたった10分でスペインのトルティーヤを作る

ポテトチップスでたった10分でスペインのトルティーヤを作る

伝統的なスペインのトルティーヤは通常、オリーブオイルで柔らかくなるまで調理されたポテトから始まります(30分以上かかる場合があります)が、ケトルで調理されたポテトチップスの助けを借りてわずか10分でテーブルに置くことができます。上のビデオはすべてがバラバラにならないように裏返す方法を含め、レシピ全体を説明しますが、必要なのは4〜5個の卵と3カップのケトルチップスだけです。

ケイト・ミドルトンとウィリアム王子は、彼らが子供たちと行っているスパイをテーマにした活動を共有しています

ケイト・ミドルトンとウィリアム王子は、彼らが子供たちと行っているスパイをテーマにした活動を共有しています

ケイト・ミドルトンとウィリアム王子は、子供向けのパズルの本の序文を書き、ジョージ王子、シャーロット王女、ルイ王子と一緒にテキストを読むと述べた.

事故で押しつぶされたスイカは、動物を喜ばせ水分補給するために野生生物保護団体に寄付されました

事故で押しつぶされたスイカは、動物を喜ばせ水分補給するために野生生物保護団体に寄付されました

Yak's Produce は、数十個のつぶれたメロンを野生動物のリハビリ専門家であるレスリー グリーンと彼女のルイジアナ州の救助施設で暮らす 42 匹の動物に寄付しました。

デミ・ロヴァートは、新しいミュージシャンのボーイフレンドと「幸せで健康的な関係」にあります: ソース

デミ・ロヴァートは、新しいミュージシャンのボーイフレンドと「幸せで健康的な関係」にあります: ソース

8 枚目のスタジオ アルバムのリリースに向けて準備を進めているデミ ロヴァートは、「スーパー グレート ガイ」と付き合っている、と情報筋は PEOPLE に確認しています。

Plathville の Kim と Olivia Plath が数年ぶりに言葉を交わすことへようこそ

Plathville の Kim と Olivia Plath が数年ぶりに言葉を交わすことへようこそ

イーサン プラスの誕生日のお祝いは、TLC のウェルカム トゥ プラスビルのシーズン 4 のフィナーレで、戦争中の母親のキム プラスと妻のオリビア プラスを結びつけました。

仕事の生産性を高める 8 つのシンプルなホーム オフィスのセットアップのアイデア

仕事の生産性を高める 8 つのシンプルなホーム オフィスのセットアップのアイデア

ホームオフィスのセットアップ術を極めよう!AppExert の開発者は、家族全員が一緒にいる場合でも、在宅勤務の技術を習得しています。祖父や曽祖父が共同家族で暮らしていた頃の記憶がよみがえりました。

2022 年、私たちのデジタル ライフはどこで終わり、「リアル ライフ」はどこから始まるのでしょうか?

20 年前のタイムトラベラーでさえ、日常生活におけるデジタルおよびインターネットベースのサービスの重要性に驚くことでしょう。MySpace、eBay、Napster などのプラットフォームは、高速化に焦点を合わせた世界がどのようなものになるかを示してくれました。

ニューロマーケティングの秘密科学

ニューロマーケティングの秘密科学

マーケティング担当者が人間の欲望を操作するために使用する、最先端の (気味が悪いと言う人もいます) メソッドを探ります。カートをいっぱいにして 3 桁の領収書を持って店を出る前に、ほんの数点の商品を買いに行ったことはありませんか? あなたは一人じゃない。

地理情報システムの日: GIS 開発者として学ぶべき最高の技術スタック

地理情報システムの日: GIS 開発者として学ぶべき最高の技術スタック

私たちが住んでいる世界を確実に理解するには、データが必要です。ただし、空間参照がない場合、このデータは地理的コンテキストがないと役に立たなくなる可能性があります。

Language