Boost.MultiIndex是否支持类似std::map::extract的“删除并返回元素”机制?
实现类似std::map::extract的Boost.MultiIndex元素提取功能
我需要在Boost.MultiIndex容器中实现类似std::map::extract的功能:移除指定元素并保留其所有权。
当前容器配置:
- 存储元素类型计划从裸指针改为
std::unique_ptr<Base>(容器完全拥有对象) - 包含两种视图:
- 插入顺序的序列视图(标记
Sequenced) - 按元素
GetId()成员函数排序的哈希唯一视图(标记Ordered)
- 插入顺序的序列视图(标记
遇到的问题:
- 由于
Base是抽象基类,无法构造空的Base对象,因此无法使用swap技巧转移std::unique_ptr的所有权 - 序列视图的swap操作是交换整个容器,而非单个元素,不适用
- Boost 1.74版本之前,哈希视图不支持
extract成员函数
最小可复现代码
#include <memory> #include <vector> #include <boost/multi_index/hashed_index.hpp> #include <boost/multi_index/identity.hpp> #include <boost/multi_index/indexed_by.hpp> #include <boost/multi_index/mem_fun.hpp> #include <boost/multi_index/sequenced_index.hpp> #include <boost/multi_index/tag.hpp> #include <boost/multi_index_container.hpp> class Base { public: virtual size_t GetId() const = 0; virtual ~Base() = default; }; class Derived : public Base { public: size_t GetId() const { return 42; } }; int main(int, char**) { // 标记:按插入顺序查看元素 struct Sequenced{}; // 标记:按id排序查看元素 struct Ordered{}; using ContainerType = boost::multi_index_container< std::unique_ptr<Base>, boost::multi_index::indexed_by< boost::multi_index::sequenced<boost::multi_index::tag<Sequenced>>, boost::multi_index::hashed_unique< boost::multi_index::tag<Ordered>, boost::multi_index::const_mem_fun<Base, size_t, &Base::GetId>>>>; ContainerType container; // 插入元素 auto& ordered_view = container.get<Ordered>(); auto new_element = std::make_unique<Derived>(); auto insert_result = ordered_view.insert(std::move(new_element)); if (!insert_result.second) return -1; // 提取id为42的元素:仅Boost 1.74及以上版本支持 std::unique_ptr<Base> extracted = std::move(ordered_view.extract(42).value()); }
关键说明
从Boost 1.74版本开始,哈希视图新增了extract成员函数,可通过键值直接提取元素并转移std::unique_ptr的所有权。在此之前的版本,没有直接实现该需求的方法:swap技巧不适用于哈希视图,序列视图的swap操作无法针对单个元素。
内容的提问来源于stack exchange,提问作者Andy Venikov
相关产品推荐
相关产品推荐

