56

私は通常、特定の型の値 (文字列やその他のオブジェクトなどのキー値) に関連付けられたデータを格納する必要があるときはいつでも、C++ stdlib マップを使用します。stdlib マップの実装は、標準の配列または stdlib ベクトルよりも優れたパフォーマンス (O(log n)) を提供するツリーに基づいています。

私の質問は、さらに優れたパフォーマンス (O(1)) を提供する C++ の「標準」ハッシュテーブル実装を知っていますか? Java API の Hashtable クラスで利用できるものに似たもの。

4

9 に答える 9

80

C++11 を使用している場合は、<unordered_map>および<unordered_set>ヘッダーにアクセスできます。これらはクラスstd::unordered_mapとを提供しますstd::unordered_set

std::tr1::unordered_mapTR1 で C++03 を使用している場合は、同じヘッダーを使用してクラスおよびにアクセスできますstd::tr1::unordered_set(GCC を使用している場合を除きます。GCC を使用している場合、ヘッダーは代わりに<tr1/unordered_map>andになり<tr1/unordered_set>ます)。

いずれの場合も、対応するunordered_multimapandunordered_multiset型もあります。

于 2008-09-25T14:15:41.893 に答える
16

unordered_map または unordered_set をまだ持っていない場合、それらはboostの一部です。
両方のドキュメントは次のとおりです。

于 2008-09-25T14:28:21.363 に答える
3

ここで多くの人が言及しているように、 hash_mapオブジェクトがありますが、 stl の一部ではありません。これは SGI 拡張なので、STL で何かを探していたのなら、運が悪いと思います。

于 2008-09-25T14:15:52.110 に答える
2

Visual Studio にstdext::hash_mapはヘッダー<hash_map>にクラスがあり、gcc__gnu_cxx::hash_mapには同じヘッダーにクラスがあります。

于 2008-09-25T14:17:51.653 に答える
2

std::tr1::unordered_map で<unordered_map>

tr1 がない場合は、boost を取得し、boost::unordered_map を使用します<boost/unordered_map.hpp>

于 2009-03-25T14:58:45.953 に答える
1

コンパイラで TR1 拡張機能を使用できる場合は、それらを使用してください。そうでない場合、boost.org には std:: 名前空間を除いて非常によく似たバージョンがあります。その場合は、後で std:: に切り替えることができるように、using 宣言を入れます。

于 2008-09-25T14:28:32.173 に答える
1

SGI のstd::hash_mapを参照してください。

これは、STLPortディストリビューションにも含まれています。

于 2008-09-25T14:14:29.413 に答える
1

hash_map は GNU のlibstdc++でもサポートされています。

Dinkumware もこれをサポートしています。これは、多くの実装が hash_map を持つことを意味します (Visual C++ でさえ Dinkumware を提供していると思います)。

于 2008-09-25T14:20:31.177 に答える
-1

std::hash_map

于 2008-09-25T14:14:20.337 に答える