这种嵌套矢量/多图/地图的使用好吗?

时间:2010-09-22 16:29:51

标签: c++ data-structures stl vector multimap

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

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

所以我这样做了:

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

typedef std::map<Foo, double> VecElem;
std::vector<VecElem> vec;

但事实证明这是低效的,因为我还必须为以下操作2提供非常快速的支持:删除{{1}具有特定值的所有Foo }和a(以及相关的双值)。

要执行此操作2,我必须迭代向量中的地图,检查b s的Fooa值并逐一删除它们地图,这似乎非常昂贵。

所以我现在正在考虑这个数据结构:

b

这应该为上面的操作1和2提供快速支持。这合理吗?嵌套容器结构有很多开销吗?

注意:每个多重映射通常只有一个或两个密钥(类型为struct Foo0 { int a, b; }; typedef std::multimap<Foo0, std::map<int, double> > VecElem; std::vector<VecElem> vec; ),每个密钥都有大约5-20个值(类型为Foo0)。

2 个答案:

答案 0 :(得分:2)

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

数据结构中的内存开销可能并不比使用同等功能设计的任何东西差得多,并且除非您计划花费更多时间而不是健康,否则更可能更好。

答案 1 :(得分:1)

嗯,你对这个想法有一个合理的开端......但是有一些问题必须先解决。

例如,类型Foo是否可变?如果是,那么你需要注意创建一个类型Foo0(因为Foo的更改可能会使{{1}无效,因此可能会听到一个不同的名称以避免混淆。 }}

其次,您需要确定是否还需要此结构才能很好地插入/更新。如果Foo0的人口是静态且不变的 - 这不是问题,但如果不是,您最终可能会花费大量时间维护FooVec

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