2011-09-04 8 views
0

intのトリプレットでアクセスするためのユニークな要素のコンテナが必要です。各intは1.000.000.000以上になる可能性があります。Boost :: Multiindexと文字列のインデックス付きboost :: unordered_map

(実際にはこれらの要素のほとんどが実際に埋められ、実際にはこれらの要素はboost :: unordered_map自体です)。

boost :: multiindex(または私が知らない何か他のもの)やboost :: unordered_mapのようなマルチインデクス配列をキーとして作った方が速いのですか?

答えて

2

マルチインデックスはあなたが望むものではありません。タイプが3つの単一のインデックスが必要なようです。 (実際には3つの独立したインデックスが必要な場合を除き、私が誤解した場合はコメントを残してください)

文字列、ただ、キーとしてのトリプルを使用します。

typedef std::tuple<int, int, int> key_type; 

あなたがstd::map<key_type, T>を使用している場合、あなたは十分かもしれ対数のルックアップを取得し、辞書場合、私は(あなたも、これ以上の作業を行う必要はありませんかわからないと思いますタプルの場合、デフォルトで比較が定義されます)。

std::unordered_map<key_type, T>(またはブーストバージョン)を使用する場合は、ハッシュ関数を定義する必要があります。 Boostには既にタプル用のものがあると思いますが、C++ 11ではそうではありません。ブーストコードを切り捨てることができるhash_combine()に基づいて自分自身を実装するのは非常に簡単です。

+0

std :: tupleは私が必要なものです。ありがとう、私はそれについて知らなかった。 – St0rM

+0

私は、 'std :: tuple'は、あなたが渡すタイプがすべてである限り、辞書式の' operator <'組み込み関数を持っていると思います。 –

+0

@Matthieu:乾杯、知っておいてよかった。 St0rM:タプルを持っていない場合( ''または ''に ''がない場合はチェックしてください)、自分で作るか、 'pair 、int> ... –

関連する問題