私はhash_set
が標準ではなく、unordered_set
が標準であることを知っています。しかし、私は、パフォーマンス賢明な、2つの違いは何ですか?なぜ彼らは別々に存在しますか?std :: hash_setとstd :: unordered_setは同じですか?
答えて
C++標準によって設定されたコンテナの複雑さの要件は、本質的に実装のための余地を残さないため、ある種のハッシュテーブルでなければなりません。この標準は、これらのデータ構造がすでに大部分のベンダーによって拡張として展開されているという認識で書かれています。
コンパイラのベンダーは、通常、これらのコンテナを「ハッシュマップ」または「ハッシュセット」と呼んでいます。これはおそらく参考になります(std::hash_set
は標準ではありませんが、GCCに別の名前空間、他のコンパイラでも同様です)。
新しい標準が作成されたとき、著者は既存の拡張ライブラリとの混同を避けたいと考えました。典型的なC++の考え方を反映した名前になりました。順序付けられていないコンテナは、よくです。順序はです。つまり、オーダーされたコンテナと比べると、それよりも少なくなりますが、このユーティリティが減少すると、より効率的なアクセスが可能になります。
実装上、hash_set、Boost-unordered、TR1-unorderedおよびC++ 11-unorderedは、同一でない場合も非常によく似ています。
あなたが参照したhash_setの名前空間は__gnu_cxxだと思います。 – h9uest
これらはほぼ同じものです。標準(C++ 0x)の名前はunordered_setです。 hash_setは、boostなどのより早い名前でした。
かなり多く、名前だけが違うのですか? MSVCにはその両方が含まれているので、私は興味があります。 – unixman83
MSVCには、以前の実装ではhash_setがあります。彼らは、hash_setを使用した開発者にとってはしばらくそれを保つ可能性が高いです。 MSはstdからstdxt名前空間にhash_setを移動しました。新しいコードにはunordered_setを使うべきです。いずれかの特定のアルゴリズムはコンパイラに依存します。 –
また、MSVCのhash_setのインターフェイスはunordered_setのインターフェイスと少し異なりますが、GCCのhash_setインターフェイスは正しく覚えていればunordered_setと似ています。 –
たとえば、Visual Studio 2010の場合、hash_xxx
とunordered_xxx
の両方があります。ヘッダーを見ると、atleastの実装はすべて少なくとも同じです(同じベース/ "ポリシー"クラス)。 他のコンパイラではわかりませんが、通常はハッシュコンテナを実装する必要があるため、違いはありません。
__gnu_cxx :: hash_setからstd :: unordered_setにコードをアップグレードした私の経験から、それらはほとんど同じですが、まったく同じものではありません。
私が遭遇した違いは、__gnu_cxx :: hash_setを反復すると、挿入の元の順序であると思われるものが返されたのに対し、std :: unordered_setは返されなかった点です。その名前が示すように、std :: unordered_set全体を反復処理するときには、イテレータを使用して特定の順序でアイテムを返すことはできません。
- 1. std :: unordered_setのKeyEqualとは何ですか?
- 2. std :: unordered_setコンストラクタ
- 3. エラー: 'unordered_setは、' C++で 'STD'
- 4. なぜ `std :: common_type_t <std :: ostream&、std :: ostream&>`は `std :: ostream`ではなく` std :: ostream`と同じですか?
- 5. std :: unordered_setの非const find()
- 6. std :: stringと同じstrncpyですか?
- 7. std :: unique()をstd :: vectorで使用する<std :: unordered_set <T>>
- 8. ポインタのセットにstd :: setまたはstd :: unordered_setを使うべきですか?
- 9. std :: setの代わりにstd :: unordered_setを使用する場合
- 10. Qtのはstd :: unordered_setアナログ/対応
- 11. std :: unordered_setの要素の要件
- 12. std :: unordered_set戻り値の型vs値
- 13. std :: unordered_setのstd :: hash関数で大文字と小文字を区別しないのはなぜですか?
- 14. これはstd :: stringと同じですか?
- 15. std :: stringstreamはu32stringと同等ですか?
- 16. std :: unordered_setの内容をstd :: vectorに効率よく移動する
- 17. std :: stringstreamの出力がstd :: stringと同じに動作しない
- 18. std :: setと同じになりますか?
- 19. std :: uniform_real_distribution同じ乱数を再生成
- 20. C++ std :: shared_futureとstd :: promiseとは何ですか?
- 21. std :: tieとstd :: make_tupleのstd :: ref引数の違いは何ですか?
- 22. std :: std :: weak_ptrとstd :: findのベクトル
- 23. `std :: mutex`との同期が` std :: atomic(memory_order_seq_cst) `よりも遅いのですか?
- 24. std :: unordered_set <Base> :: count(Derived c)を持つ方法はありますか?
- 25. のstd :: Fooクラス
- 26. std :: invokeとstd :: functionの違いは何ですか?
- 27. std :: valarrayとstd :: arrayの違いは何ですか
- 28. std :: setとstd :: vectorの違いは何ですか?
- 29. スカラとは何ですか?getline()、std :: cin.eof()、std :: cin.bad()?ここ
- 30. std :: string :: c_strとstd :: string :: dataの違いは何ですか?
1つが作成され、もう1つがドラフト標準の一部になったため、別々に存在します。それらは同時に作成されませんでした。 –
@JonathanGrynspan:あなたはそれを答えにしてみませんか?あなたが知っているので、質問に答えます;) –
彼らはどちらも同じアルゴリズムを使用していますか? – unixman83