C++ priority_queue的使用

相关头文件

        #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()函数取目前队列中的最小值。                

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值