web-dev-qa-db-ja.com

C標準ライブラリにハッシュテーブルがないのはなぜですか?

標準Cライブラリの一部としてHashtableがサポートされていないのはなぜですか?これには具体的な理由はありますか?

47
Shankar Raju

次のいずれかの理由で、標準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の精神の側面のいくつかは、次のようなフレーズで要約できます。

  • プログラマを信頼してください。
  • プログラマーがやるべきことをするのを妨げないでください。
  • 言語を小さくシンプルに保ちます。
  • 操作を行う方法を1つだけ提供します。
  • ポータブルであることが保証されていない場合でも、高速にしてください。

その3つ目は、おそらくライブラリが初期の標準化努力で大規模に拡張されなかった主な理由です-そして、委員会からのそのような拡張がおそらくC89ではなくC2038とラベル付けされたANSI Cをもたらしたという事実。

39
paxdiablo

Cは、有用なデータ構造が定義されていないため、今日の標準では珍しいようです。なし。文字列すらありません—そして、C文字列がデータ構造であると考えるなら、「データ構造」とは何かに同意する必要があります。

Cが好きなら、それを「空白のスレート」と考えてください...アプリケーション全体は、あなたとあなたが選択したライブラリによって書かれたコードと、いくつかのかなり原始的な標準ライブラリ関数でできています。 qsortなどの例外。最近では、Cを使用してPython、Ruby、Apache、またはLinuxカーネルなどを実装しています。とにかく、独自のデータ構造をすべて使用するプロジェクトであり、STLのようなものを使用する可能性は低いでしょう。

多くのCライブラリは、汎用ハッシュテーブルを実装しています。トレードオフがあり、お気に入りを選択できます。それらのいくつかは、コールバックを使用して構成可能です。

  • Glibにはハッシュテーブルオブジェクトがあります( documentation
  • Apache Portable Runtimeにはハッシュテーブルがあります( documentation
  • AppleのCore Foundationライブラリにはハッシュテーブルがあります( documentation )注:はい、キーまたは値として任意のオブジェクトを挿入できます。
  • UTHashはハッシュテーブルライブラリです( documentation
  • 別のハッシュテーブルライブラリ( link

これらのすべてのライブラリはあなたが望むことをしますが、C標準にハッシュテーブルを追加する意味は何ですか?

45
Dietrich Epp

標準Cライブラリには、anyの大規模で永続的なデータ構造が含まれていません-リスト、ツリー、スタック、ハッシュテーブルのいずれもありません。

元のCライブラリの作成者に問い合わせることなく決定的な答えを出すことは、実際には不可能です。しかし、もっともらしい説明は、そのようなデータ構造の実装にはさまざまなトレードオフが含まれており、アプリケーションの作成者だけがそれらのトレードオフを行う正しい位置にいるということです。

POSIX標準Cライブラリは、一般的なハッシュテーブル関数を指定することに注意してください:hcreate()hsearch()およびhdestroy();また、"one size fits all"という性質により、ほとんどの実際のユースケースでは不適切になる傾向があり、上記の引数をサポートします。

10
caf

テンプレートがないため

これは推測ですが、C++のような言語でテンプレートを持たないと、ユーザー定義型はもちろん、すべての可能な型をカバーするために多数の定義が必要になるため、コンテナの実装が非常に洗練されます。

これを緩和するためのC戦略があり、void *が、コンパイル時の型チェックを失います。

現在のところ、GLibとgnulibが推奨される実装です。 Cで辞書を実装する簡単な方法