使用boost::container实现带有多态元素的平衡红黑树 flat_set
flat_set 是C++ STL中的一个非顺序容器,它被实现为有序集合,其中所有元素都以平衡树的形式存储。虽然 flat_set 在大多数情况下的性能表现都比 std::set 更好(具体原因可以参考这里),但由于它不能存储多态类型,所以在某些应用场景下可能会受到限制。例如,在需要使用基类指针管理一组派生类对象时,传统的 flat_set 并不能满足需求,因为它只能保证存储元素的类型都相同。
然而,利用 boost::container 库提供的 allocator_traits 和 key_of_value 工具类,我们可以轻松实现带有多态元素的 flat_set。本文将介绍如何扩展 flat_set,以便它支持存储任意类型的指针,同时仍然保持性能优异和内存友好的特点。
首先,我们需要定义一个 template 类型,用于描述 flat_set 中的元素类型。这个类型应该包含两个模板参数:基类类型和分配器类型。基类类型是被存储指针的基类,而分配器类型则是用于分配内存的类型,通常是 std::allocator 或 boost::container::pmr::polymorphic_allocator。
template <typename Base, typena