2012-11-16 25 views
9

私は2つの集合AとBの要素aとbを持っていますが、これらはお互いに関連しています(0..1:n基数)。各bは、A内の項目との関連付けを複数(少なくとも1つ)持つことができます。 Aは整数の組で、Bは整数です。双方向ランダムアクセスのためのC++効率的なデータ構造

このような「双方向」地図を効率的に保存する方法はありますか?

map<pair<unsigned int, unsigned int>, unsigned int> AtoB 
map<unsigned int, vector<pair<unsigned int, unsigned int> > > BtoA 

しかし、おそらくこれをより効率的に対処するための良い方法があります: Aシンプルなアプローチは、2つのマップを使用することです。 boost::bimapについてどのように

ご協力いただきありがとうござい

答えて

7

Boostには、これを処理する2つのライブラリ、Boost.BimapおよびBoost.MultiIndexが含まれています。前者は単射(双指向性)マップの問題に固有であり、第2はより一般的であり、任意のインデックスを持つメモリ内のデータベースに類似したものを実装します。

あなたのunsigned intキーがあなたのペアに一意にマップされていないとすれば、私はMultiIndexがもっと順調だと思います。それは私が最後にこのライブラリを使用していたので、長い時間ですが、あなたはブーストを使用しない場合は、チュートリアルを見て、あなたは、あなたは、少なくともあなたの現在の設定を簡素化することができ、

struct YourData { 
    unsigned key; 
    std::pair<unsigned, unsigned> value; 
}; 

typedef multi_index_container< 
    YourData, 
    indexed_by< 
     ordered_non_unique<member<YourData, unsigned, &YourData::key> >, 
     ordered_unique<member<YourData, std::pair<unsigned, unsigned>, 
           &YourData::value> > 
    > 
> YourContainer; 

のようなものが必要になります

map<unsigned int, vector<pair<unsigned int, unsigned int> > > 

std::multimap<unsigned, std::pair<unsigned, unsigned>>で置き換えます。

1

MapとMultimapはO(log n)の効率を持ちますので、データを保存する最良の方法だと思います。私は使用することを提案する

map<pair<unsigned int, unsigned int>, unsigned int> AtoB 
multimap<pair<unsigned int, unsigned int>, unsigned int> BtoA