平衡树
__gnu_pbds::tree
附:官方文档地址
1 2 3 4 5 6 |
|
模板形参
Key
: 储存的元素类型,如果想要存储多个相同的Key
元素,则需要使用类似于std::pair
和struct
的方法,并配合使用lower_bound
和upper_bound
成员函数进行查找Mapped
: 映射规则(Mapped-Policy)类型,如果要指示关联容器是 集合,类似于存储元素在std::set
中,此处填入null_type
,低版本g++
此处为null_mapped_type
;如果要指示关联容器是 带值的集合,类似于存储元素在std::map
中,此处填入类似于std::map<Key, Value>
的Value
类型Cmp_Fn
: 关键字比较函子,例如std::less<Key>
Tag
: 选择使用何种底层数据结构类型,默认是rb_tree_tag
。__gnu_pbds
提供不同的三种平衡树,分别是:rb_tree_tag
:红黑树,一般使用这个,后两者的性能一般不如红黑树splay_tree_tag
:splay 树ov_tree_tag
:有序向量树,只是一个由vector
实现的有序结构,类似于排序的vector
来实现平衡树,性能取决于数据想不想卡你
Node_Update
:用于更新节点的策略,默认使用null_node_update
,若要使用order_of_key
和find_by_order
方法,需要使用tree_order_statistics_node_update
Allocator
:空间分配器类型
构造方式
1 2 3 4 |
|
成员函数
insert(x)
:向树中插入一个元素x
,返回std::pair<point_iterator, bool>
,其中第一个元素代表插入位置的迭代器,第二个元素代表是否插入成功。erase(x)
:从树中删除一个元素/迭代器x
。如果x
是迭代器,则返回指向x
下一个的迭代器(如果x
是end()
则返回end()
);如果x
是Key
,则返回是否删除成功(如果不存在则删除失败)。order_of_key(x)
:返回严格小于x
的元素个数(以Cmp_Fn
作为比较逻辑),即从 开始的排名。find_by_order(x)
:返回Cmp_Fn
比较的排名所对应元素的迭代器。lower_bound(x)
:返回第一个不小于x
的元素所对应的迭代器(以Cmp_Fn
作为比较逻辑)。upper_bound(x)
:返回第一个严格大于x
的元素所对应的迭代器(以Cmp_Fn
作为比较逻辑)。join(x)
:将x
树并入当前树,x
树被清空(必须确保两树的 比较函数 和 元素类型 相同)。split(x,b)
:以Cmp_Fn
比较,小于等于x
的属于当前树,其余的属于b
树。empty()
:返回是否为空。size()
:返回大小。
注意
join(x)
函数需要保证并入树的键的值域与被并入树的键的值域 不相交(也就是说并入树内所有值必须全部大于/小于当前树内的所有值),否则会抛出 join_error
异常。
如果要合并两棵值域有交集的树,需要将一棵树的元素一一插入到另一棵树中。
示例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 |
|
参考资料
本页面最近更新:2024/11/20 19:30:43,更新历史
发现错误?想一起完善? 在 GitHub 上编辑此页!
本页面贡献者:ChungZH, HeRaNO, Ir1d, isdanni, ksyx, llleixx, opsiff, StableAgOH, Tiphereth-A, Xeonacid, zyzzyh
本页面的全部内容在 CC BY-SA 4.0 和 SATA 协议之条款下提供,附加条款亦可能应用