2008-09-25 10 views
52

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

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

答えて

74

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

あなたはTR1とC++ 03を使用している場合(あなたはヘッダが<tr1/unordered_map>、代わりに<tr1/unordered_set>である場合にはGCCを、使用している場合を除く)、あなたは同じヘッダを使用して、クラスstd::tr1::unordered_mapstd::tr1::unordered_setへのアクセス権を持っています。

いずれの場合も対応するunordered_multimapunordered_multisetタイプがあります。

+6

GCCでは、ヘッダ名を代わりに使用する必要があります。それはGCCの奇抜です。 :-) –

+0

VS2008 Feature PackはSP1に置き換えられました。 – Ferruccio

+0

IIRC VC9 Feature PackおよびSP1 tr1 :: unordered_ *の実装では、準最適なパフォーマンスのリリースノートが警告されました。私はこれが最終的に修正されると思います。 – jwfearn

1

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

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

+0

に ブースト:: unordered_mapを使用していない場合、それはですまだ追求されている問題として、 "標準"ではない。 hash_mapという_standard_クラスはありません。代わりにunordered_mapと呼ばれ、TR1にあります。 –

3

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

2

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

+0

同じインターフェースを持っていれば、名前空間のエイリアスとプリプロセッサのいくつかの作業を使って両方をサポートする実装を作るのはかなり簡単です。 –

+0

私は知っている、私は知っている、これは非難されたものです。すべての同僚がVS 2008に切り替えるか、Boostをインストールすると確信できるわけではありません。したがって、これらを一緒にする方法についての良いトリックです: '名前空間std { #ifdef __GNUC__ \t using namespace __gnu_cxx; #elif \t using namespace stdext; #endif }「 – ypnos

1

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

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

+0

これは広くサポートされているかもしれませんが、質問者の質問によれば、「標準」ではありません。 TR1施設のみが標準とみなされます。 –

+0

私が作ったのは、すべてのコンパイラベンダーがサポートしていれば(あるいはstdlibC++のベンダーがそうであるかもしれない)、それが「標準」の代用として十分かもしれないということです。ところで、TR1はまだ "標準"ではありません。それはベンダーにそれを実装させるのに十分な次の標準のために受け入れられる(私のポイント...) –

+0

私はそれがlibstdC++バージョン> = 4.0のためだけだと思いますか? – rogerdpack

16

まだunordered_mapまたはunordered_setが設定されていない場合、それらはboostの一部です。
Here's the documentation for both

+0

ブーストで_maximal portability_をもう一度提供しています。 :-)この他の例については、http://stackoverflow.com/questions/131445を参照してください。 –

1

yorコンパイラでTR1拡張を使用できる場合は、それらを使用してください。そうでない場合、boost.orgにはstd :: namespaceを除いて全く同じバージョンがあります。その場合は、using宣言を使用して、std :: laterに切り替えることができます。

2
<unordered_map>

のstd :: tr1を:: unordered_map、あなたは、TR1を持ってブーストを取得し、それを版STLPortに含まれていてもよい<boost/unordered_map.hpp>

関連する問題