假设我有一组Person对象,每个对象都是这样的:
class Person
{
string Name;
string UniqueID;
}
现在,对象必须存储在一个容器中,这个容器允许我对它们进行排序,这样我就可以给项目X轻松找到项目X + 1和X-1。
但是,我还需要基于UniqueID的快速访问,因为集合很大,线性搜索不会削减它。
我当前的'解决方案'是将std :: list与std :: map结合使用。该列表包含Persons(用于有序访问),该映射用于将UniqueID映射到对列表项的引用。更新“容器”通常涉及更新地图和列表。
它有效,但我觉得应该有更明智的方法,也许boost:bimap
。建议?
编辑:我对“订购”的要求存在一些疑惑。为了解释,对象从文件顺序流式传输,容器中项目的“顺序”应与文件顺序匹配。订单与ID无关。
答案 0 :(得分:8)
boost:bimap
是最明显的选择。 bimap
基于boost::multi_index
,但bimap
具有简化的语法。我个人更喜欢boost::multi_index
而不是boost::bimap
因为它可以在将来轻松地向Person
结构添加更多索引。
答案 1 :(得分:7)
没有标准库容器可以执行您想要的操作 - 因此您必须使用两个容器或Boost解决方案。如果使用两个容器,在几乎所有情况下,我通常更喜欢列表中的向量或双端队列。
答案 2 :(得分:1)
为什么不使用两个地图,一个有Person作为Key,另一个有UniqueId作为Key,但这需要更新它们。
您可以创建一个回调函数,只要有任何更改,就会更新两个映射。