次のシナリオに最適なデータ構造を探しています。
インデックスi
があり、それぞれについて次の操作をサポートする必要があります1Foo
:オブジェクト(以下を参照)をすばやく検索します。各オブジェクトはdouble
値に関連付けられています。
だから私はこれをしました:
struct Foo {
int a, b, c;
};
typedef std::map<Foo, double> VecElem;
std::vector<VecElem> vec;
しかし、次の操作に対しても非常に高速なサポートを提供する必要があるため、非効率的であることがわかります2 :およびFoo
に特定の値を持つすべてのを削除します(関連するdouble値と一緒に)。a
b
この操作2を実行するには、ベクトル内のマップを反復処理し、Foo
sの値a
とb
値を確認して、マップから1つずつ消去する必要があります。これは非常にコストがかかるようです。
だから私は今、代わりにこのデータ構造を検討しています:
struct Foo0 {
int a, b;
};
typedef std::multimap<Foo0, std::map<int, double> > VecElem;
std::vector<VecElem> vec;
これにより、上記の操作1と2の両方が高速にサポートされます。それは合理的ですか?ネストされたコンテナ構造からのオーバーヘッドはたくさんありますか?
注:各マルチマップには通常、(タイプの)1つまたは2つのキーしかなくFoo0
、それぞれに(タイプの)約5〜20の値がありますstd::map<int,double>
。