web-dev-qa-db-ja.com

C ++のハッシュテーブル?

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

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

55
Marcos Bento

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

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

すべての場合に、対応するunordered_multimapおよびunordered_multiset型もあります。

78

Unordered_mapまたはunordered_setがまだない場合、それらは boost の一部です。
両方のドキュメントがあります

16
Mark Ransom

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

3
Craig H

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

2
Adam Rosenfield

<unordered_map>のstd :: tr1 :: unordered_map

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

2
rlbond

Yorコンパイラで利用可能なTR1拡張機能がある場合は、それらを使用します。そうでない場合、boost.orgのバージョンはstd ::名前空間を除いて非常に似ています。その場合は、後で宣言を使用できるようにusing-declarationを入力します。

1
MSalters

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

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

1
Adam Tegen

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

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

1
Ben Collins