哪个STL容器用于基于密钥访问的有序数据?

时间:2010-07-12 11:32:48

标签: c++ stl containers

假设我有一组Person对象,每个对象都是这样的:

class Person 
{
  string Name;
  string UniqueID;
}

现在,对象必须存储在一个容器中,这个容器允许我对它们进行排序,这样我就可以给项目X轻松找到项目X + 1和X-1。

但是,我还需要基于UniqueID的快速访问,因为集合很大,线性搜索不会削减它。

我当前的'解决方案'是将std :: list与std :: map结合使用。该列表包含Persons(用于有序访问),该映射用于将UniqueID映射到对列表项的引用。更新“容器”通常涉及更新地图和列表。

它有效,但我觉得应该有更明智的方法,也许boost:bimap。建议?

编辑:我对“订购”的要求存在一些疑惑。为了解释,对象从文件顺序流式传输,容器中项目的“顺序”应与文件顺序匹配。订单与ID无关。

3 个答案:

答案 0 :(得分:8)

boost:bimap是最明显的选择。 bimap基于boost::multi_index,但bimap具有简化的语法。我个人更喜欢boost::multi_index而不是boost::bimap因为它可以在将来轻松地向Person结构添加更多索引。

答案 1 :(得分:7)

没有标准库容器可以执行您想要的操作 - 因此您必须使用两个容器或Boost解决方案。如果使用两个容器,在几乎所有情况下,我通常更喜欢列表中的向量或双端队列。

答案 2 :(得分:1)

为什么不使用两个地图,一个有Person作为Key,另一个有UniqueId作为Key,但这需要更新它们。

您可以创建一个回调函数,只要有任何更改,就会更新两个映射。