pb_ds简介
pb_ds简介
pb_ds 库全称 Policy-Based Data Structures,又称平板电视。
pb_ds 库封装了很多数据结构,比如哈希(Hash)表,平衡二叉树,字典树(Trie 树),堆(优先队列)等。
就像 vector 、 set 、 map 一样,其组件均符合 STL 的相关接口规范。部分(如优先队列)包含 STL 内对应组件的所有功能,但比 STL 功能更多。
pb_ds 只在使用 libstdc++
为标准库的编译器下可以用。
堆
使用方法
1 |
|
T
: 储存的元素类型Compare
: 提供严格的弱序比较类型Tag
: 是 __gnu_pbds 提供的不同的五种堆,Tag 参数默认pairing_heap_tag 五种分别是:pairing_heap_tag
:配对堆 官方文档认为在非原生元素(如自定义结构体
/std :: string
/pair
) 中,配对堆表现最好binary_heap_tag
:二叉堆 官方文档认为在原生元素中二叉堆表现最好,不过我测试的表现并没有那么好binomial_heap_tag
:二项堆 二项堆在合并操作的表现要优于配对堆*但是其取堆顶元素的rc_binomial_heap_tag
:冗余计数二项堆thin_heap_tag
:除了合并的复杂度都和 Fibonacci 堆一样的一个 tag
Allocator
:空间配置器,由于 OI 中很少出现,故这里不做讲解
至少对于 OIer 来讲,除了配对堆的其他四个 tag 都是鸡肋,要么没用,要么常数大到不如 std 的,且有可能造成 MLE,故这里只推荐用默认的配对堆。同样,配对堆也优于 algorithm 库中的 make_heap() 。
构造方式
1 | __gnu_pbds ::priority_queue<int> q1; |
成员函数
push()
: 向堆中压入一个元素,返回该元素位置的迭代器。pop()
: 将堆顶元素弹出。top()
: 返回堆顶元素。size()
返回元素个数。empty()
返回是否非空。modify(point_iterator, const key)
: 把迭代器位置的 key 修改为传入的 key ,并对底层储存结构进行排序。erase(point_iterator)
: 把迭代器位置的键值从堆中擦除。join(__gnu_pbds :: priority_queue &other)
: 把 other 合并到 *this 并把 other 清空。
下面是不同tag的各个操作对应的时间复杂度
1 |
|
All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.