標準Cライブラリの一部としてHashtableがサポートされていないのはなぜですか?これには具体的な理由はありますか?
次のいずれかの理由で、標準Cライブラリにはハッシュテーブルがありません。
これがISOの仕組みです。提案は提出され、承認または拒否されます。
2つの競合するグループがあるため、標準ライブラリに追加するものに注意する必要があります。 ser、として、言語をより便利にするために、Sunの下のすべてのデータ構造を標準に追加することができます。
しかし、言語としてimplementor(さておき、これらはおそらくさまざまなワーキンググループのほとんどを構成する傾向がある人々であるため、彼らの見解はより影響を与える可能性が高い)、あなたは本当に誰もが使用できないかもしれないものを実装しなければならないという手間が欲しい。 C89が登場したときにそこにあったものはすべて、新しいプラクティスを導入するのではなく、既存のプラクティスを体系化することが主な目的であるという事実に関係することでした。それ以降、標準のすべての反復は、できることについて少し自由になりましたが、下位互換性は依然として重要な問題です。
私自身も、対立があります。私は、Java、C++、またはPythonライブラリのすべての機能をCで自由に使えるようにしたいと思っています。もちろん、そうすると、初心者のためにすべてを学ぶのが非常に難しくなります。 1人のコメント者が述べたように、おそらくすべてのコードモンキーが有用なコードを出力できるようにすることで、プロセスにおける私の価値が低下します:-)
そして、私はほとんどhave長く(ほとんど)輝かしいキャリアから、これまでに必要なすべてのデータ構造を取得しました。この種のものの標準ライブラリに限定されません。仕事をするために手に入れることができるサードパーティのツールがたくさんあり、(私のように)あなたも自分のものを転がすことができます。
各反復で特定の決定が行われた理由を知りたい場合、ISO(およびISOが引き継ぐ前のANSI)は通常、根拠のあるドキュメントを公開します。 ANSIからのC89のものは こちら にあります。この小さな美しさがスコープに含まれています:
この理論的根拠は、基本文書に記載されている言語の追加、説明、変更に主に焦点を当てています。これは、C言語全体の理論的根拠ではありません。委員会は、新しい言語を設計するのではなく、既存の言語を体系化する責任があります。この根拠では、宣言の構文や演算子の結合など、言語の既存の構文を保護する試みは行われていません。
私は特に、彼らが標準化の試みよりも先だったかもしれない不浄な混乱に責任を負わないことを認めています。
しかし、おそらくあなたの質問に対する本当の答えは、このビットにあり、指針となる原則の1つです。
Cの精神を守ります。委員会は、Cの伝統的な精神を維持するための主要な目標として維持しました。Cの精神には多くの側面がありますが、本質は、C言語の基礎となる基本原則のコミュニティ感情です。 Cの精神の側面のいくつかは、次のようなフレーズで要約できます。
その3つ目は、おそらくライブラリが初期の標準化努力で大規模に拡張されなかった主な理由です-そして、委員会からのそのような拡張がおそらくC89ではなくC2038とラベル付けされたANSI Cをもたらしたという事実。
Cは、有用なデータ構造が定義されていないため、今日の標準では珍しいようです。なし。文字列すらありません—そして、C文字列がデータ構造であると考えるなら、「データ構造」とは何かに同意する必要があります。
Cが好きなら、それを「空白のスレート」と考えてください...アプリケーション全体は、あなたとあなたが選択したライブラリによって書かれたコードと、いくつかのかなり原始的な標準ライブラリ関数でできています。 qsort
などの例外。最近では、Cを使用してPython、Ruby、Apache、またはLinuxカーネルなどを実装しています。とにかく、独自のデータ構造をすべて使用するプロジェクトであり、STLのようなものを使用する可能性は低いでしょう。
多くのCライブラリは、汎用ハッシュテーブルを実装しています。トレードオフがあり、お気に入りを選択できます。それらのいくつかは、コールバックを使用して構成可能です。
これらのすべてのライブラリはあなたが望むことをしますが、C標準にハッシュテーブルを追加する意味は何ですか?
標準Cライブラリには、anyの大規模で永続的なデータ構造が含まれていません-リスト、ツリー、スタック、ハッシュテーブルのいずれもありません。
元のCライブラリの作成者に問い合わせることなく決定的な答えを出すことは、実際には不可能です。しかし、もっともらしい説明は、そのようなデータ構造の実装にはさまざまなトレードオフが含まれており、アプリケーションの作成者だけがそれらのトレードオフを行う正しい位置にいるということです。
POSIX標準Cライブラリは、一般的なハッシュテーブル関数を指定することに注意してください:hcreate()
、hsearch()
およびhdestroy()
;また、"one size fits all"という性質により、ほとんどの実際のユースケースでは不適切になる傾向があり、上記の引数をサポートします。
テンプレートがないため
これは推測ですが、C++のような言語でテンプレートを持たないと、ユーザー定義型はもちろん、すべての可能な型をカバーするために多数の定義が必要になるため、コンテナの実装が非常に洗練されます。
これを緩和するためのC戦略があり、void *
が、コンパイル時の型チェックを失います。
現在のところ、GLibとgnulibが推奨される実装です。 Cで辞書を実装する簡単な方法