C++ 使用嵌套向量/多重映射/映射可以吗?

C++ 使用嵌套向量/多重映射/映射可以吗?,c++,data-structures,stl,vector,multimap,C++,Data Structures,Stl,Vector,Multimap,我正在为以下场景寻找完美的数据结构: 我有一个索引I,对于每个索引,我都需要支持以下操作1:快速查找其Foo对象(见下文),每个对象都与一个双值关联 所以我这样做了: struct Foo { int a, b, c; }; typedef std::map<Foo, double> VecElem; std::vector<VecElem> vec; 这将为上述操作1和2提供快速支持。这合理吗?嵌套容器结构是否有大量开销 注意:每个多重映射通常只有一个或两个键(

我正在为以下场景寻找完美的数据结构:

我有一个索引
I
,对于每个索引,我都需要支持以下操作1:快速查找其
Foo
对象(见下文),每个对象都与一个
双值关联

所以我这样做了:

struct Foo {
  int a, b, c;
};

typedef std::map<Foo, double> VecElem;
std::vector<VecElem> vec;
这将为上述操作1和2提供快速支持。这合理吗?嵌套容器结构是否有大量开销


注意:每个多重映射通常只有一个或两个键(类型为
Foo0
),每个键大约有5-20个值(类型为
std::map
)。

回答标题问题:是的,嵌套STL容器是完全正确的。根据您的使用情况,这可能会导致在幕后过度复制。更好的选择可能是使用
Boost::shared_ptr
包装除顶级容器外的所有容器的内容,这样容器管理就不需要嵌套容器的整个内容的深度副本。如果您计划花费大量时间在顶级
vector
中插入和删除
VecElem
,则会出现这种情况-如果
VecElem
是一个直接的
multimap
,成本会很高


数据结构中的内存开销可能不会比使用等效功能设计的任何东西都严重,而且更可能更好,除非您计划在这方面花费比正常情况更多的时间。

好吧,您已经有了一个合理的开始。。。但有一些问题必须首先解决

例如,类型
Foo
是可变的吗?如果是,那么您需要小心创建类型
Foo0
(嗯……为了避免混淆,最好使用不同的名称),因为对
Foo
的更改可能会使
Foo0
无效

其次,您需要决定是否也需要此结构才能很好地用于插入/更新。如果
Foo
的数量是静态的且不变的-这不是问题,但如果不是,您可能会花费大量时间维护
Vec
VecElem


就嵌套STL容器的问题而言,这很好——通常用于创建任意复杂的结构。

Hmm,我确实需要在
Vec
向量及其元素中插入和删除很多内容…Foo对象真的只有3个整数,其中两个整数一起作为搜索键吗?或者这是一个示例?您是否需要映射以任何特定顺序对
Foo
对象进行排序?如果没有,那么你可以先按a和b,然后按c按字典顺序排列它们。然后,对于操作2,您不必遍历每个映射的整个部分,就可以找到具有给定
a
b
的所有
Foo
。相反,对于每个映射使用
map::lower_bound(Foo(a,b,MIN_INT))然后向前走。@MSB:它们实际上只是3个整数。@Steve:这是一个非常好的主意,谢谢。不过,
map::lower_bound(Foo(a,b,MIN_INT))
会给我一个映射的迭代器吗?它编译吗?我认为
下限
至少需要3个参数?如果您使用
(a,b)
作为搜索键,并且
c
(a,b)
而异,您只需将def
Foo
键入
,然后使用
生成对(x,y)
从多重映射中搜索/检索。我不明白你为什么需要向量来存储多重映射。
struct Foo0 {
  int a, b;
};

typedef std::multimap<Foo0, std::map<int, double> > VecElem;
std::vector<VecElem> vec;