【问题标题】:STL Vectorised Map - Looking for Best PracticeSTL 矢量化地图 - 寻找最佳实践
【发布时间】:2013-03-04 05:56:25
【问题描述】:

我对 STL 不太熟悉,所以我不确定这里的最佳方法。

我有一组动作,每个动作都与一个唯一的 ID 相关联。为了确保我不会重复这些操作,我最初想将它们存储在std::map 中,并键入 ID。但是,我需要在内部保持严格的顺序a lastd::vector,这样当我展开我的操作时,它们会以相反的顺序出现。

任何给定的操作列表都可以是从一两个项目到数千个项目的任何地方。如果我切换到手动检查 vector 是否有重复项(即遍历和检查 ID),我会丢失任何东西吗?或者是否有某种形式的 map 或其他我可以使用的容器让我通过 ID 进行查找,但不会在内部对元素进行排序或重新排序?

【问题讨论】:

  • 一个粗略的选择就是同时使用两者;)

标签: c++ map vector stl


【解决方案1】:

您可能想要使用boost:multi_index 映射,它可以支持映射的插入顺序。

struct Item 
{
      string name;
      int data;
};
struct ItemTag {};
typedef multi_index_container<
    Item,
    indexed_by<
        random_access<>, // this index represents insertion order
        hashed_unique< tag<ItemTag>, member<Item, string, &Item::name> >
    >
> ItemsMap;

【讨论】:

  • 谢谢,这看起来像是一个解决方案。但是(这可能是异端!),我目前没有使用 Boost,它看起来像是一个相当重量级的库,只是为了解决这个问题(这是一个主要是 MFC 应用程序,我试图在其中引入 STL添加了更新的内容,但我不会改造现有的 CArrayCMap 东西)。
  • 那么我建议同时使用两个集合(地图+矢量)。 Map 可以让你快速查找,vector 会保持顺序。
  • 请原谅我太密集了,但你的意思是使用map 纯粹用于查找/重复检查,使用vector 用于存储(或者deque 是我在此之后需要的)?所以我的权衡是通过我的mapint ID 略微增加存储空间(也许)?
  • 是的,正如你所说。但是“存储”取决于您放入集合中的确切类型(值、指针、智能指针)。如果您按值存储项目,那么您可以拥有 vector 和 map。因此,每次添加新元素时,都将其添加到两个集合中,将值放入向量并将指向它的指针放入映射中。
【解决方案2】:

听起来你需要Boost.MultiIndex

Boost Multi-index Containers Library 提供了一个名为 multi_index_container 的类模板,它支持构建容器来维护一个或多个具有不同排序和访问语义的索引。索引提供类似于 STL 容器的接口,使使用它们变得熟悉。对同一元素集合进行多索引的概念是从关系数据库术语中借用的,它允许本着多索引关系表的精神来规范复杂的数据结构,其中简单的集合和映射是不够的。提供了广泛的索引选择,模仿类似的 STL 容器,如 std::set、std::list 和散列集。

【讨论】:

    猜你喜欢
    • 2013-07-01
    • 2017-05-11
    • 1970-01-01
    • 2019-11-30
    • 1970-01-01
    • 2010-10-11
    • 2015-12-10
    • 2011-04-07
    • 1970-01-01
    相关资源
    最近更新 更多