0

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

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

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

4

2 回答 2

2

您可能想要使用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;
于 2013-03-03T21:55:30.500 回答
2

听起来你需要Boost.MultiIndex

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

于 2013-03-03T21:56:25.287 回答