どちらがより効率的ですか?良いベンチマークはありますか?
4 に答える
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があります。
だから、それはすでにそこにあります。
C ++ 0x unordered_mapは、ブースト1に基づいて提案されています。Boostライブラリ自体にも名前空間tr1::unordered_mapがあり、独自のboost::unordered_mapの実装を共有しています。
比較したい場合(もちろん、ブーストとブーストを比較する必要はありません)、Microsoft Visual Studio 2010やgccなど、他のいくつかのコンパイラには独自のunordered_map実装があると思います。それらが名前空間tr1の下にあると想定して、それらを使用できます。
#include <unordered_map>
...
std::tr1::unordered_map<...>
私はまだベンチマークを知りませんでしたが、実際の標準が完成し、より多くの人々がライブラリを使用するようになると、コンパイラの実装者は確実に独自の実装を最適化するため、この初期の段階ではベンチマークは意味がないと思います。
まだ言及されていない1つのマイナーな点として、このstd::hash
関数は、組み込み型と文字列(およびその他のいくつかの型)のハッシュを計算できるようにするためにのみ必要です。この関数は、やboost::hash
などのより複雑なオブジェクトのハッシュを計算できます。また、boostには、ユーザー定義型のハッシュの作成を支援する機能があります。pair
tuple
hash_combine
これは、コンパイルされstd::unordered_set< pair<int, int> >
ないことを意味しますが、コンパイルされboost::unordered_set< pair<int, int> >
ます。
boost::hash
必要に応じてと一緒に使用できますstd::unordered_*
。
(参照:ライブラリ拡張テクニカルレポートの問題リストの項目6.18 。)
問題の実装とデータセットによって異なります。ブログの投稿unordered_map
で遊んでいたとき、VS10のパフォーマンスは、使用した入力よりもはるかに悪いことがわかりました(完全なベンチマークを作成していませんでした)。理論的には違いはないはずだと考えました。std::unordered_map
boost::unordered_map