如何让Boost MultiIndex容器按插入顺序存储元素?
解决Boost.MultiIndex容器保留插入顺序的问题
你现在的容器只定义了一个哈希唯一复合键索引,它只会保证键的唯一性并做哈希存储,不会维护插入顺序。要实现按插入顺序存储,只需要给容器添加一个sequenced类型的索引就可以了——Boost.MultiIndex支持同时拥有多个索引,完美适配这种既要保证唯一性又要保留插入顺序的场景。
修改后的容器定义如下:
typedef boost::multi_index_container< X, // 存储的数据类型 boost::multi_index::indexed_by< // 第一个索引:sequenced,维护插入顺序 boost::multi_index::sequenced<>, // 第二个索引:哈希唯一复合键,保证name+p1+p2的唯一性 boost::multi_index::hashed_unique< boost::multi_index::composite_key< X, boost::multi_index::member<X, std::string, &X::name>, boost::multi_index::member<X, std::string, &X::p1>, boost::multi_index::member<X, std::string, &X::p2> > > > > container;
关键说明:
sequenced索引会按照元素插入的先后顺序存储,默认情况下容器的默认迭代器(直接用begin()/end())就是使用这个索引的,遍历的时候就能得到插入顺序。- 原来的哈希唯一索引现在是第二个索引,如果你需要通过复合键查找元素,可以用
get<1>(your_container)来获取这个索引的视图,然后进行查找操作。 - 插入元素的逻辑不用改,
insert()方法会自动更新所有索引:既保证复合键的唯一性(重复插入会失败),同时也会把新元素追加到sequenced索引的末尾。
比如你可以这样按插入顺序遍历:
container c; // 插入元素... for (const auto& elem : c) { // 按插入顺序访问elem }
如果要通过复合键查找:
auto& hash_idx = get<1>(c); auto it = hash_idx.find(std::make_tuple("name_val", "p1_val", "p2_val")); if (it != hash_idx.end()) { // 找到元素 }
内容的提问来源于stack exchange,提问作者Simus
相关产品推荐
相关产品推荐

