どちらが効率的ですか?良いベンチマークはありますか?C++ 0x標準ではunordered_mapがありますが、unordered_mapをどのように押し上げるのですか?
答えて
C++ 11のstd :: unordered_mapの仕様は、tr1 :: unordered_mapに基づくboost :: unordered_mapに似ています。それは、いくつかの小さな違いがあると言われています。 C++ 11で右辺値参照を追加すると、パフォーマンスに役立つemplace関数とemplace_hint関数が追加されます。
現在、C++ 11は広く実装されているので、std :: unordered_mapをそのまま使用することができます。 C++ 14はそれを大幅に変更せず、C++ 17は(おそらく)insert_or_assignとtry_emplaceメンバ関数を追加します。
最新のC++ 0x標準ドラフトn3225には、セクション23.6.1のクラステンプレートunordered_mapがあります。
だから既にそこにある。
ブースト1に基づいて、C++ 0x unordered_mapが提案されています。 Boostライブラリ自体には、独自のboost :: unordered_mapの実装を共有する名前空間tr1 :: unordered_mapもあります。
ブーストとブーストを比較する必要はありませんが、Microsoft Visual Studio 2010やgccなどのいくつかのコンパイラには、独自のunordered_map実装があると思います。名前空間tr1の下にあると仮定することによってそれらを使用できます。
#include <unordered_map>
...
std::tr1::unordered_map<...>
本当の標準が確定されたときに、コンパイラの実装は間違いなく独自の実装を最適化しますので、任意のベンチマークは意味がないとより多くの人々があり、私はまだベンチマークを知りませんでしたが、私はこの初期の時点で考えますライブラリを使用する予定です。
明示的に 'tr1'を要求しない限り、' boost'名前空間にあります。 –
今のところ最高のパフォーマンスのためにブースト1を使うべきですか? – returneax
予想されるパフォーマンスに基づいて選択を行うべきではありません。アプリケーションをプロファイリングした後で、 'unordered_map'実装がボトルネックとなっていることが判明したら、最適化の機会を探してください。 – SingleNegationElimination
これは実装と問題のデータセットによって異なります。 でblog postと遊んでいたとき、私はVS30のstd::unordered_map
がboost::unordered_map
の入力に対して私が(私は完全なベンチマークを作っていませんでした)を使用していました。理論的には違いはないはずだと思った。
まだ言及していない1つの短所がありますが、std::hash
関数は、組み込み型と文字列(およびその他のいくつかの型)のハッシュを計算できることが必要です。 boost::hash
関数は、より複雑なオブジェクト、例えば、pair
とtuple
のハッシュを計算することができます。 boostには、ユーザー定義型のハッシュ作成を支援する関数hash_combine
があります。
つまり、std::unordered_set< pair<int, int> >
はコンパイルされませんが、boost::unordered_set< pair<int, int> >
となります。
boost::hash
は、必要に応じてstd::unordered_*
と使用できます。
(参考:項目the Library Extension Technical Report Issues Listで6.18)
を参照してください。これは実際には非常に重要な情報であることがわかりました。必然的に、ハッシュ関数をクックアップする必要のある自分のクラスを扱うことになります。したがって、2014年でさえ、私は自分のクラスのハッシュマップを保存するときにboost :: unordered_setを使用しています。これは簡単にハッシュ関数を作成できるためです。 – moodboom
- 1. 標準C++ライブラリにはどのような例外クラスがありますか
- 2. STL unordered_mapが__m128の値でクラッシュする
- 3. C++でunordered_mapでエラーが発生しましたか?
- 4. どのようにunordered_map原因sigsegv
- 5. C++ 0xの「標準レイアウト」
- 6. C++でunordered_mapを同期
- 7. C++ unordered_mapをbuffer(char *)にシリアライズ
- 8. どの標準に従う必要がありますか?
- 9. Androidでunordered_mapを使用するには?
- 10. 次のC標準のアイデアはどこにありますか?
- 11. C++標準ライブラリのヘッダはどこにありますか
- 12. C++に標準のgetch()がありますか?
- 13. std :: unordered_mapベクトルの添え字が範囲外にある
- 14. unordered_mapは4.2
- 15. unordered_mapでの検索のパフォーマンス
- 16. C++ STL unordered_mapイテレータ問題
- 17. C++ unordered_mapユーザ定義型
- 18. GCCでunordered_mapエラーが発生しました
- 19. C++に標準キューがありますか?
- 20. hash_mapとunordered_mapの違いは?
- 21. 多くのサイトで標準のフィードバックボタンがありますか?
- 22. なぜ、__cache_hash_codeは、std :: __ unordered_mapにのみ使用できますか?
- 23. unordered_map挿入()エラー
- 24. ベクタをキーとして使用するとC++のunordered_mapが失敗する
- 25. プロセスコミュニケーションを扱う標準のHaskellライブラリがありますか?
- 26. unordered_mapでテンプレート値を挿入する際にエラーが発生しました。
- 27. R値の挿入がunordered_mapで機能しない
- 28. java用のApacheコモンズのような、標準のC#libはありますか?
- 29. iPhoneのプログラミングで標準のファイルオープンダイアログがありますか?
- 30. unordered_map - ハッシュ関数は無効です
私はそれがベンチマークに非常に困難になりますので、C++ 0xの標準は、実装を指定していないと思います。あなたは実際にstlの特定の実装を求めていますか? – lijie
BoostからC++標準にインポートされた機能のうち、STLの順序付けられていないマップはありませんか? – Kos
C++ 0x unordered_mapは、ブーストライブラリに基づいていません。ブーストライブラリの実装前に定義されたTR1 unordered_mapに基づいています。 – hmuelner