一. priority_queue(优先队列)的本质是一个堆,它允许用户为队列中元素设置优先级,放置元素的时候不是直接放到队尾,而是放置到比它优先级低的元素前面。
二. priority_queue有三个模板参数:priority_queue<Type, Container, Functional>,无特殊需求时后两个可以省略
①Type:为数据类型
②Container:为保存数据的容器,必须是用数组实现的容器,比如vector,deque等等,但不能用list,因为STL里面默认用的是vector
③Functional:为元素比较方式。如果是基本数据类型或已定义了比较运算符的类,可以直接用STL的less算子和greater算子,默认使用less算子,即从大到小排列,序列顶最大的先出队,如果使用greater算子,则队列按由小到大的顺序排列,出队时,序列顶的最小的元素先出队
下面将介绍priority_queue容器的一些常见用法:
1.关于priority_queue的初始化
(1)不添加任何算子,默认降序排列
priority_queue<int> pq;
(2)升序队列
priority_queue<int,vector<int>,greater<int>> pq;
(3)降序队列,和(1)一样
priority_queue<int,vector<int>,less<int>> pq;
2.向priority_queue中加入一个元素
pq.push(5);
pq.emplace(6);
//这两种写法都可以,后一种在某些时候更加高效
3.删除priority_queue的队首元素
pq.pop();
4.返回priority_queue的队首元素
pq.top();
5.判断priority_queue当前是否为空
pq.empty();
6.自定义比较算子
(1)重载操作符:
bool operator < (const node &a, const node &b) { // 加上&是用引用传递,不加是按值传递,前者效率更高,但效果是一样的
return a.value < b.value; // 按照value值从大到小排列
}
priority_queue<node> pq;
(2)比较函数声明方式:
struct cmp {
bool operator ()(const node &a, const node &b) {
return a.value > b.value; // 按照value值从小到大排列
}
};
priority_queue<node, vector<node>, cmp> pq;
(3)结构体声明方式:
struct node {
int value;
friend bool operator<(const node &a, const node &b) {
return a.value < b.value; // 按value值从大到小排列
}
};
priority_queue<node> pq;