【问题标题】:Which STL container for ordered data with key-based access?哪个 STL 容器用于具有基于键的访问的有序数据?
【发布时间】:2011-03-14 18:33:51
【问题描述】:

假设我有一个 Person 对象的集合,每个对象看起来像这样:

class Person 
{
  string Name;
  string UniqueID;
}

现在,这些对象必须存储在一个容器中,以便我可以订购它们,以便我可以很容易地给项目 X 找到项目 X+1 和 X-1。

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

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

它有效,但我觉得应该有一个更聪明的方法,也许是boost:bimap。有什么建议吗?

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

【问题讨论】:

  • X+1X-1 是什么意思?我感觉它不是指UniqueID 字段,那是什么?你指的是什么顺序?
  • 我指的是容器内的排序。即(假设一个向量)Array[X]、[X-1] 和 [X+1]
  • 容器中的顺序是什么?我认为这就是马蒂厄试图确定的。
  • @Joel,容器中的订单就是“容器中的订单”。没有指定它的字段(还)。这只是项目从文件中流入的顺序。 (是的,这很重要)
  • 在这种情况下,bimap 可能是要走的路。

标签: c++ stl containers


【解决方案1】:

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

【讨论】:

  • 顺便问一下母语人士:indicesindexes?
  • Indices 是技术上正确的复数名词。但是每个人都会理解indexes...
  • 谢谢。令人沮丧的是,我发现我的工具链 (C++Builder 2010) 不支持 boost::multi_index 或 bimap,但是嘿,至少我知道我应该使用什么。
【解决方案2】:

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

【讨论】:

  • @Neil,谢谢。使用向量意味着删除或插入一个项目可能会使我的地图中的所有引用无效。因此列表。
  • @Roddy:我不确定您的要求,但我知道您将列表用作队列。如果我错了,请随时纠正我,但如果我是对的,那么 Neil 的 deque 解决方案是有道理的。
  • @Matthieu,遗憾的是:我仍然需要随机插入/删除,这不会使所有其他项目的位置无效。
  • 如果元素是按特定顺序从文件中读取的,您如何需要插入?在我看来,除了删除之外,您永远不需要其他任何东西,因为记录不会神奇地出现在文件中。
  • @Matthieu:把它想象成一个文本编辑器:打开一个有序的“行”文件,然后用户随机添加/删除/编辑,我们最终保存了一个更新的有序行文件。
【解决方案3】:

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

您可以创建一个回调函数,以便在有任何更改时更新两个地图。

【讨论】:

  • "你可以创建一个回调函数..." 啊 - 我该怎么做??
猜你喜欢
  • 2011-09-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-16
  • 1970-01-01
  • 2011-11-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多