2011-10-01 4 views
15

私はhash_setが標準ではなく、unordered_setが標準であることを知っています。しかし、私は、パフォーマンス賢明な、2つの違いは何ですか?なぜ彼らは別々に存在しますか?std :: hash_setとstd :: unordered_setは同じですか?

+0

1つが作成され、もう1つがドラフト標準の一部になったため、別々に存在します。それらは同時に作成されませんでした。 –

+4

@JonathanGrynspan:あなたはそれを答えにしてみませんか?あなたが知っているので、質問に答えます;) –

+0

彼らはどちらも同じアルゴリズムを使用していますか? – unixman83

答えて

21

C++標準によって設定された​​コンテナの複雑さの要件は、本質的に実装のための余地を残さないため、ある種のハッシュテーブルでなければなりません。この標準は、これらのデータ構造がすでに大部分のベンダーによって拡張として展開されているという認識で書かれています。

コンパイラのベンダーは、通常、これらのコンテナを「ハッシュマップ」または「ハッシュセット」と呼んでいます。これはおそらく参考になります(std::hash_setは標準ではありませんが、GCCに別の名前空間、他のコンパイラでも同様です)。

新しい標準が作成されたとき、著者は既存の拡張ライブラリとの混同を避けたいと考えました。典型的なC++の考え方を反映した名前になりました。順序付けられていないコンテナは、よくです。順序はです。つまり、オーダーされたコンテナと比べると、それよりも少なくなりますが、このユーティリティが減少すると、より効率的なアクセスが可能になります。

実装上、hash_set、Boost-unordered、TR1-unorderedおよびC++ 11-unorderedは、同一でない場合も非常によく似ています。

+0

あなたが参照したhash_setの名前空間は__gnu_cxxだと思います。 – h9uest

1

これらはほぼ同じものです。標準(C++ 0x)の名前はunordered_setです。 hash_setは、boostなどのより早い名前でした。

+0

かなり多く、名前だけが違うのですか? MSVCにはその両方が含まれているので、私は興味があります。 – unixman83

+1

MSVCには、以前の実装ではhash_setがあります。彼らは、hash_setを使用した開発者にとってはしばらくそれを保つ可能性が高いです。 MSはstdからstdxt名前空間にhash_setを移動しました。新しいコードにはunordered_setを使うべきです。いずれかの特定のアルゴリズムはコンパイラに依存します。 –

+0

また、MSVCのhash_setのインターフェイスはunordered_setのインターフェイスと少し異なりますが、GCCのhash_setインターフェイスは正しく覚えていればunordered_setと似ています。 –

2

たとえば、Visual Studio 2010の場合、hash_xxxunordered_xxxの両方があります。ヘッダーを見ると、atleastの実装はすべて少なくとも同じです(同じベース/ "ポリシー"クラス)。 他のコンパイラではわかりませんが、通常はハッシュコンテナを実装する必要があるため、違いはありません。

3

__gnu_cxx :: hash_setからstd :: unordered_setにコードをアップグレードした私の経験から、それらはほとんど同じですが、まったく同じものではありません。

私が遭遇した違いは、__gnu_cxx :: hash_setを反復すると、挿入の元の順序であると思われるものが返されたのに対し、std :: unordered_setは返されなかった点です。その名前が示すように、std :: unordered_set全体を反復処理するときには、イテレータを使用して特定の順序でアイテムを返すことはできません。

関連する問題