首页 >后端开发 >C++ >如何在保持高效查找的同时保留映射中的插入顺序?

如何在保持高效查找的同时保留映射中的插入顺序?

Susan Sarandon
Susan Sarandon原创
2024-12-03 16:17:11485浏览

How Can I Preserve Insertion Order in a Map While Maintaining Efficient Lookups?

在 std::map 中保留插入顺序

在插入顺序至关重要的情况下,仅依赖 std::map 可能不够。如果维护插入顺序是首要任务,则可以考虑其他方法。

其中一个选项涉及在迭代和打印其值之前将映射的内容转换为 std::vector。通过利用合适的函子,您可以使用 std::sort 根据元素的插入顺序排列元素。

但是,如果快速查找是必需的(例如 1000 万次),则使用向量可能会提高性能的担忧。对于此类场景,boost::multi_index 库提供了一种将映射的效率与多个索引的灵活性相结合的解决方案。

使用 boost::multi_index:

该库允许您为每个容器建立多个索引。在这种特定情况下,您可以定义一个包含 string 和 int 成员的 value_t 结构,并使用两个索引:

  1. 随机访问: 表示插入顺序
  2. Hashed Unique: 对字符串成员建立索引以方便快速查找

然后您可以像这样实例化一个 multi_index_container:

struct value_t {
    string s;
    int i;
};

struct string_tag {};

typedef multi_index_container<
    value_t,
    indexed_by<
        random_access<>, // insertion order
        hashed_unique<tag<string_tag>, member<value_t, string, &value_t::s>>
    >
> values_t;

这种方法可以实现高效的查找,同时在迭代容器时保留插入顺序。

以上是如何在保持高效查找的同时保留映射中的插入顺序?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn