2010-12-11 6 views
5

どちらが効率的ですか?良いベンチマークはありますか?C++ 0x標準ではunordered_mapがありますが、unordered_mapをどのように押し上げるのですか?

+2

私はそれがベンチマークに非常に困難になりますので、C++ 0xの標準は、実装を指定していないと思います。あなたは実際にstlの特定の実装を求めていますか? – lijie

+1

BoostからC++標準にインポートされた機能のうち、STLの順序付けられていないマップはありませんか? – Kos

+2

C++ 0x unordered_mapは、ブーストライブラリに基づいていません。ブーストライブラリの実装前に定義されたTR1 unordered_mapに基づいています。 – hmuelner

答えて

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

+0

よろしくお願いいたします。私のコンパイラはg ++なので、そうすべきですよね? – returneax

+0

はい。移植性については、http://stackoverflow.com/questions/724465/how-to-check-for-tr1-while-compiling – alexk7

2

最新の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<...> 

本当の標準が確定されたときに、コンパイラの実装は間違いなく独自の実装を最適化しますので、任意のベンチマークは意味がないとより多くの人々があり、私はまだベンチマークを知りませんでしたが、私はこの初期の時点で考えますライブラリを使用する予定です。

+0

明示的に 'tr1'を要求しない限り、' boost'名前空間にあります。 –

+0

今のところ最高のパフォーマンスのためにブースト1を使うべきですか? – returneax

+5

予想されるパフォーマンスに基づいて選択を行うべきではありません。アプリケーションをプロファイリングした後で、 'unordered_map'実装がボトルネックとなっていることが判明したら、最適化の機会を探してください。 – SingleNegationElimination

1

これは実装と問題のデータセットによって異なります。 でblog postと遊んでいたとき、私はVS30のstd::unordered_mapboost::unordered_mapの入力に対して私が(私は完全なベンチマークを作っていませんでした)を使用していました。理論的には違いはないはずだと思った。

2

まだ言及していない1つの短所がありますが、std::hash関数は、組み込み型と文字列(およびその他のいくつかの型)のハッシュを計算できることが必要です。 boost::hash関数は、より複雑なオブジェクト、例えば、pairtupleのハッシュを計算することができます。 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)

+0

を参照してください。これは実際には非常に重要な情報であることがわかりました。必然的に、ハッシュ関数をクックアップする必要のある自分のクラスを扱うことになります。したがって、2014年でさえ、私は自分のクラスのハッシュマップを保存するときにboost :: unordered_setを使用しています。これは簡単にハッシュ関数を作成できるためです。 – moodboom

関連する問題