Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/162.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 哪个STL容器用于基于密钥访问的有序数据?_C++_Stl_Containers - Fatal编程技术网

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

C++ 哪个STL容器用于基于密钥访问的有序数据?,c++,stl,containers,C++,Stl,Containers,假设我有一个Person对象的集合,每个对象如下所示: class Person { string Name; string UniqueID; } 现在,对象必须存储在一个容器中,该容器允许我对它们进行排序,这样我就可以给项目X轻松定位项目X+1和X-1 然而,我也需要基于UniqueID的快速访问,因为收集量会很大,线性搜索不会减少它 我目前的“解决方案”是将std::list与std::map结合使用。列表包含人员(用于有序访问),映射用于将UniqueID映射到列表项的引用。

假设我有一个Person对象的集合,每个对象如下所示:

class Person 
{
  string Name;
  string UniqueID;
}
现在,对象必须存储在一个容器中,该容器允许我对它们进行排序,这样我就可以给项目X轻松定位项目X+1和X-1

然而,我也需要基于UniqueID的快速访问,因为收集量会很大,线性搜索不会减少它

我目前的“解决方案”是将std::list与std::map结合使用。列表包含人员(用于有序访问),映射用于将UniqueID映射到列表项的引用。更新“容器”通常包括更新映射和列表

这是可行的,但我觉得应该有一种更聪明的方法,也许是
boost:bimap
。建议


编辑:我对“订购”的要求有些混乱。为了说明这一点,对象是从一个文件按顺序流入的,容器中项目的“顺序”应该与文件顺序相匹配。顺序与ID无关

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

没有标准的库容器可以满足您的需要-因此您必须使用两个容器或boost解决方案。如果使用两个容器,在几乎所有情况下,我通常更喜欢向量或deque而不是列表。

为什么不使用两个贴图,一个以Person为键,另一个以UniqueId为键,但这需要同时更新它们


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

@Neil,谢谢。使用向量意味着删除或插入项目可能会使地图中的所有引用无效。罗迪:我不确定你的要求,但我有一个想法,你可以用你的列表作为一个队列。如果我错了,请随时纠正我,但如果我是对的,那么Neil的
deque
解决方案是有意义的。@Matthieu,遗憾的是没有:我仍然需要随机插入/删除,这不会使所有其他项的位置无效。如果元素是按特定顺序从文件中读取的,您如何需要插入?在我看来,除了删除,你再也不需要其他任何东西了,因为记录不能神奇地出现在文件中。@Matthieu:把它想象成一个文本编辑器:打开一个有序的“行”文件,用户然后随机添加/删除/编辑,最后我们保存一个更新的有序行文件。顺便说一下,问母语人士:
索引
索引
索引
是技术上正确的复数名词。但是每个人都能理解索引,谢谢。令人沮丧的是,我;我发现我的工具链(C++Builder 2010)不支持boost::multi_index或bimap,但嘿,至少我知道我应该使用什么。你说的
X+1
X-1
是什么意思?我有一种感觉,它不是指
UniqueID
字段,那么它是什么呢?你指的是什么订单?我指的是集装箱内的订单。i、 e(假设为向量)数组[X]、[X-1]和[X+1]容器中的顺序是什么?我想这就是Matthieu想要确定的。@Joel,容器中的顺序只是“容器中的顺序”。还没有字段指定它。这只是从文件中导入项目的顺序。(是的,这很重要)在这种情况下,bimap可能是一种方式。“你可以创建一个回调函数…”啊-我该怎么做??