2009-06-28 8 views
8

このような構造体はC++標準ライブラリにありますか?私は他のものにアクセスすることはできないので、tr1でunordered_mapは使用できません(そしてboostなど)。lookuptimeを使ったC++のデータ構造O(1)、stlのjavaのhashmapのように?

私が持っているのは、私が格納しなければならない多数のカスタムクラス要素100000+であり、非常に高速なO(1)をeverageにアクセスする必要があります。要素がランダムに格納され、要素の位置がわからないため、配列/ベクトルは使用できません。

私の唯一の代替手段は、C++標準ライブラリのみを使用できる独自のハッシュマップ実装です。

答えて

5

問題は、O(1)検索が標準ではないことです。私はどのようなブーストがあるのか​​は不明ですが、sgiのようないくつかのSTL実装はhash_mapを持っています。それがあなたが必要とするものです。

ここにはdocumentationがあります。

ただ、試してみる:これが動作するかどうか

#include <hash_map> 

は覚えておいて、それは移植性がありません...多分のためには、今、それは大丈夫だ、と後であなたが回避策を見つけることができます。

+0

私が間違っているんだけど、私は次のCを聞いたと思うなら、私を修正してください++ standardにはhash_mapが含まれます。誰でもこの事実を知っていますか? – Tom

+3

Boostは次のように述べています。「これを念頭に置いて、C++標準ライブラリテクニカルレポートでは、ハッシュテーブルを使用して実装された順序付けられていない連想型コンテナが導入され、C++標準の作業草案に追加されました。 –

+0

ありがとう、ジョン!私はどこかでそれを聞いて想像していなかったのでうれしいです。 – Tom

4

なぜブーストを使用できないのですか? Unorderedコレクションライブラリは "Header only"です。つまり、BoostのBJamビルドプロセスとインストーラをプルする必要はありません。 .hppファイルを取得してプロジェクトに追加するだけです。

+0

基本的に私は何かを "リッピング"することは許されず、stdを標準としてのみ使用します。本当になぜ私はそのような制限があるのか​​分からない。 しかし、私はあなたがブーストをインストールせずにヘッダーをつかむことができるのか分からなかった..チップをありがとう! – Milan

1

現在の標準のデフォルトのSTLには、O(1)ルックアップコンテナがありません。

+0

これはなぜですか... – Litherum

0

一部のSTLでは、hash_mapと同様に、unordered_map(これは、TR1バージョンのC++で呼び出され、呼び出される)です。

0

unordered_mapコンテナを使用できます。そのtr1で、次の完全な標準になります。 Visual Studioは<unordered_map>とマニュアルでの実装があり、ここで見つけることができます:http://msdn.microsoft.com/en-us/library/bb982522.aspx

2

hash_mapは、STLへのSGI拡張の一部です。 GCCでは、以下を実行することでそれを使用できます。私は他の実装について知らない:

#include <ext/hash_map> 

using __gnu_cxx::hash_map; 

hash_map<int,string> foo; // or whatever 

unordered_mapはTR1の一部です。 GCCでは、以下を実行することでそれを使用できます。私は他の実装について知らない:

あなたが本当に std::に制限されていると何かを使用できない場合
#include <tr1/unordered_map> 

using std::tr1::unordered_map; 

unordered_map<int,string> foo; // or whatever 
6

std::mapが最善の策です。これは、あなたに対数ルックアップ時間を与えます。一定のものではありませんが、配列/ベクトルと比較すると、はるかに高速です。また、私は、100000要素の対数ルックアップは、十分に速くなるだろうと推測し、ハッシュテーブルを使用して多くの勝利を得ることはありません。

あなたの実装にはすでにいくつかのハッシュテーブル実装が含まれている可能性があります。std::mapは本当に速い十分でないのであれば、試してください

#include <tr1/unordered_map> 
std::tr1::unordered_map<int,int> test; 

または

#include <hash_map> 
stdext::hash_map<int,int> test; 

あるいは

#include <boost/tr1/unordered_map.hpp> 
std::tr1::unordered_map<int,int> test; 
+0

stdext!あなたはちょうど私の検索の束を救った。ありがとう! –

関連する問題