相关头文件
#include <queue>
类模板声明
代码如下,可以看出模板内默认使用的底层容器是vector,默认比较器是二元谓词less。其中,C++提供了两种标准的底层容器用于选择,分别是vector和deque;可供选择的比较器在头文件 #include <functional>下,一般常用的是less和greator。
template <class T, class Container=vector<T>, class Compare=less<typename Container::value_type> >
class priority_queue;
内部实现
它是一个容器适配器container adaptor。它的实现基于heap这种数据结构,支持在任意时刻插入新的元素(push操作),但是每次只能检索“优先级最高”的元素(top操作)。
它内部有序性的实现使用了三个算法函数(the algorithm functions),分别是 make_heap,push_heap和pop_heap。
支持的操作
- empty():判断是否为空
- size():返回元素的个数
- pop():弹出堆顶元素,即top操作所获取的元素,并重新排序
- push():插入新的元素到堆里,并重新排序
- top():返回堆顶元素,即优先级最高的元素
- swap():交换两个优先级队列的元素
- emplace(T args):插入新的元素到堆里,并重新排序。
重点说一下这里的“比较器”
“比较器”实际上就是二元谓词(Binary Predicate),也就是一个返回bool值的函数对象(或称“仿函数”)。函数对象就是一个重载了运算符“()”的类。因此,这里的BinaryPredicte就是重载了运算符“()”的类,但这个重载函数的返回值为bool,同时必须有两个形参。
在说说默认比较器less,代码实践证明,它会生成一个大顶堆,即每棵子树的根节点都大于它的所有子节点的值。因此,它公共函数top(),每次都返回队列中的最大值。同样的,对于比较器greater,它会生成一个小顶堆,即每棵子树的根节点都小于它的所有子节点的值。因此,top()函数取目前队列中的最小值。