You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 11:37:40