pb_ds 库介绍
什么是 pb_ds
?
pb_ds
库全称 Policy-Based Data Structures
,翻译后就是 “基于策略的数据结构”。
在这个库中包含了哈希(Hash)表,平衡树,字典树(Trie 树),堆(优先队列)等数据结构,可以(或许)在竞赛中使用(请参考以下的使用条件)。
使用的条件
官方已经在以下编译器进行测试:
- g++ version: 3.3.1, 3.4.4, 4.0, 4.1, 4.2
- Intel icpc 8.1 与 9
- Visual C++ .Net 2005
博主已在以下编译器进行编译测试:
- g++ version: 6, 7, 8, 9, 10, 11
- clang version: 3, 4, 5, 6, 7, 8, 9, 10, 11
命名空间
1 | namespace __gnu_pbds |
后文默认为已使用命名空间__gnu_pbds
但未使用 std
tree
pb_ds
库中的 tree
均为平衡树,且支持多种底层数据结构。
头文件
1 |
模板
1 | template <typename Key, typename Mapped, typename Cmp_Fn = std::less<Key>, |
模板参数
Key
指存储的数据类型(由于不支持存储一样的数,所以经常使用double
)Mapped
指的是映射的对象的类型,如果不需要映射就使用null_type
,而版本号低(待补充)的g++
需要使用null_mapped_type
Cmp_Fn
为存储类型的比较函数,可以自行编写或使用std::less<Key>
或std::greater<Key>
Tag
选择底层数据结构的类型,分别为:rb_tree_tag
红黑树splay_tree_tag
ov_tree_tag
有序向量树
Node_Update
节点更新策略,如果要查询某个数的排名或查询某个排名的数可使用tree_order_statistics_node_update
构造例子
1 | tree<double, null_type, std::less<double>, rb_tree_tag, |
成员函数
insert(x)
插入数 $x$,返回值类型为St4pairIN10__gnu_pbds6detail25bin_search_tree_const_it_IPNS1_13rb_tree_node_IdmSaIcEEEdPdPKdRdRS8_Lb1ES4_EEbE
erase(x)
从树中删除数 $x$ 或迭代器 $x$,返回值类型为bool
order_of_key(x)
查询 $x$ 的排名(可近似认为以Cmp_Fn
来排序后的排名)find_by_order(x)
查询排名为 $x$ 的元素(同样以Cmp_Fn
来排名),从 $0$ 开始lower_bound(x)
返回不小于 $x$ 的元素的迭代器upper_bound(x)
返回大于 $x$ 的元素的迭代器join(x)
如果两树类型相同则将 $x$ 树并入当前的树,并入后 $x$ 树被删除split(x, t)
以Cmp_Fn
进行比较后,小于等于 $x$ 的元素保留至当前的树,其他则属于树 $t$empty()
判断树是否为空size()
返回树的大小
例子:洛谷 P6136 【模板】普通平衡树(数据加强版)
1 |
|
trie
trie 为字典树。
头文件
1 |
模板
1 | template <typename Key, typename Mapped, typename Cmp_Fn = std::less<Key>, |
模板参数
Key
指存储的数据类型(建议使用std::string
)Mapped
指的是映射的对象的类型,如果不需要映射就使用null_type
,而版本号低(待补充)的g++
需要使用null_mapped_type
Cmp_Fn
为存储类型的比较函数,可以自行编写或使用std::less<Key>
或std::greater<Key>
Tag
选择底层数据结构的类型,建议使用pat_trie_tag
Node_Update
节点更新策略
构造例子
1 | trie<string, null_type, trie_string_access_traits<>, pat_trie_tag, |
成员函数
insert(x)
插入字符串 $x$erase(x)
删除字符串 $x$x.join(y)
将 $y$ 并入 $x$ 并清空 $y$