pbds 平板电视 容器学习
pbds是GUN C++内封装的容器,虽然不是C++14标准中的,在noi linux中可以使用。其提供了平衡树,字典树,哈希表,优先队列。
使用pbds是需要头文件的.
#include <ext/pb_ds/assoc_container.hpp> //关联容器,必加
#include <ext/pb_ds/hash_policy.hpp> //哈希表
#include <ext/pb_ds/tree_policy.hpp> //平衡树
#include <ext/pb_ds/trie_policy.hpp> //字典树
#include <ext/pb_ds/priority_queue.hpp> //优先队列
但是如果你不想背,pbds也有自己的万能头。
#include <bits/extc++.h>
平衡树。
手写平衡树很麻烦,常数大。而STL中的set,map,multiset都不支持🍵排名和前驱/后继。 pbds可以解决这个问题。
如何使用?
构造方法
__gnu_pbds ::tree<Key,
Mapped,
Cmp_Fn = std::less<Key>,
Tag = rb_tree_tag,
Node_Update = null_tree_node_update,
Allocator = std::allocator<char>>
key:你平衡树排序的键值。但是pbds是不重复的,如果要存储多个相同的键值,可以通过pair增加存储时间戳的方法实现形式上的不同。
Mapped: 映射规则:如果你只是存储键值,则此处填入 __gnu_pbds::null_type;如果要指示关联容器是 带值的集合,类似于map 中,此处填入类似于 std::map<Key, Value> 的 Value 类型
Cmp_Fn :用于处理键值比较的类,这里使用的是std::less,其实就是小于号。 平时一般是自己写用于比较的类,例如
struct cmp{
bool operator(const Key &a,const Key &b) {
return a<b;
}
};
这个和优先队列一样得反着写.例如图中的这个就是大根堆.
Tag:底层数据结构类型。有三种:
-
__gnu_pbds::rb_tree_tag红黑树,这一般是性能最好的。 -
__gnu_pbds::splay_tree_tag, Splay树。 -
__gnu_pbds::ov_tree_tag有序向量树。不建议使用
Node_Update: 维护节点附加信息的规则的,例如要维护子树大小就可以使用__gnu_pbds::tree_order_statistics_node_update,详细来讲就是每次树的形态发生变化的时候会自动更新计算子树大小。其提供了两个附加函数
-
order_of_key(x)可以查询求有多少元素严格小于 x(排名) -
find_by_order(k)找第 k 小元素(0 开始)
Allocator:空间分配器类型 一般不用管.
成员函数
size() 返回容器大小
empty() 返回容器是否为空
erase(x):从树中删除一个元素 / 迭代器 x,返回一个 bool 表明是否删除成功。
order_of_key(x):返回 x 以 Cmp_Fn 比较的排名。
find_by_order(x):返回 Cmp_Fn 比较的排名所对应元素的迭代器。
lower_bound(x):以 Cmp_Fn 比较做 lower_bound,返回迭代器。
upper_bound(x):以 Cmp_Fn比较做 upper_bound,返回迭代器。
join(x):将 x 树并入当前树,前提是两棵树的类型一样,x 树被删除。
split(x,b):以 Cmp_Fn 比较,小于等于 x 的属于当前树,其余的属于 b 树。
insert(x):向树中插入一个元素 x,返回 std::pair<point_iterator, bool>。表示插入成功后元素的迭代器和是否插入成功
erase(x):从树中删除一个元素 / 迭代器 x,返回一个 bool 表明是否删除成功。
order_of_key(x):返回 x 以 Cmp_Fn 比较的排名。
find_by_order(x):返回 Cmp_Fn 比较的排名所对应元素的迭代器。
lower_bound(x):以Cmp_Fn比较做 lower_bound,返回迭代器。
upper_bound(x):以Cmp_Fn 比较做 upper_bound,返回迭代器。
join(x):将 x 树并入当前树,前提是两棵树的类型一样,x 树被删除。
split(x,b):以 Cmp_Fn 比较,小于等于 x 的属于当前树,其余的属于 b 树。

浙公网安备 33010602011771号