5

どちらがより効率的ですか?良いベンチマークはありますか?

4

4 に答える 4

5

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メンバー関数を追加します。

于 2010-12-11T16:05:11.637 に答える
2

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<...>

私はまだベンチマークを知りませんでしたが、実際の標準が完成し、より多くの人々がライブラリを使用するようになると、コンパイラの実装者は確実に独自の実装を最適化するため、この初期の段階ではベンチマークは意味がないと思います。

于 2010-12-11T01:40:56.447 に答える
2

まだ言及されていない1つのマイナーな点として、このstd::hash関数は、組み込み型と文字列(およびその他のいくつかの型)のハッシュを計算できるようにするためにのみ必要です。この関数は、やboost::hashなどのより複雑なオブジェクトのハッシュを計算できます。また、boostには、ユーザー定義型のハッシュの作成を支援する機能があります。pairtuplehash_combine

これは、コンパイルされstd::unordered_set< pair<int, int> >ないことを意味しますが、コンパイルされboost::unordered_set< pair<int, int> >ます。

boost::hash必要に応じてと一緒に使用できますstd::unordered_*

(参照:ライブラリ拡張テクニカルレポートの問題リストの項目6.18 。)

于 2010-12-13T16:25:30.607 に答える
1

問題の実装とデータセットによって異なります。ブログの投稿unordered_mapで遊んでいたとき、VS10のパフォーマンスは、使用した入力よりもはるかに悪いことがわかりました(完全なベンチマークを作成していませんでした)。理論的には違いはないはずだと考えました。std::unordered_mapboost::unordered_map

于 2010-12-12T09:44:35.220 に答える