这次我们来看 C++26 标准库最值得关注的新容器之一:std::hive。它以前叫std::colony,名字听着陌生,但解决的问题非常直接:能否在一个容器里同时做到插入和删除都接近 O(1),删除任意一个元素都不会让其他元素的引用、指针和迭代器失效,同时遍历性能还不能像std::list那样因为每个节点独立分配而差到没法看。std::hive的设计是用固定大小的块来批量存储元素,块内部通过空闲列表复用被删除元素留下的槽位,块与块之间再用跳跃链表连接起来。这样既绕开了std::list逐节点分配的代价,也避免了std::vector在中间插入、删除时必须搬移大量元素的问题。如果你正在做游戏实体管理、事件系统、图结构、对象池一类需要频繁增删且要保留对象地址的场景,这篇文章可以直接收藏。我会从设计背景、编译器支持、接口用法、性能观察、对比分析和常见坑这几个角度把它讲清楚。
1.std::hive核心能力速览
| 能力项 | 说明 |
|---|---|
| 标准状态 | C++26 标准库新容器,前身为std::colony/plf::colony |
| 头文件 | <hive> |
| 迭代器类型 | 前向迭代器,不支持随机访问,没有operator[] |
| 插入复杂度 | 摊销 O(1),批量分配块,优先复用已删除槽位 |
| 删除复杂度 | 摊销 O(1),删除不会让其他元素的引用/指针/迭代器失效 |
| 遍历性能 | 块内元素连续存储,缓存友好度介于vector和list之间,具体取决于删除密度 |
| 元素地址稳定性 | 插入新元素不会导致已有元素迁移,删除也不会移动其他元素 |
| 编译器支持 | MSVC STL 在新版 Visual Studio 2022 中已提供实现;GCC/libstdc++ 和 Clang/libc++ 仍需等待 |
| 典型场景 | 游戏实体管理、事件监听、图节点、对象池、需要稳定地址的缓存 |
| 不适合场景 | 随机访问、按业务顺序排序后遍历、需要严格连续内存布局的场景 |
std::hive与传统顺序容器最本质的差异是它的删除语义:你删除一个元素,只影响这个元素自己,其他已存在元素的地址完全不变。这是很多长时间存活的对象系统一直想要的特性。