C++优先队列priority_queue
优先队列头文件
优先队列是一种容器适配器类型,顾名思义,优先队列中的元素有着大小先后顺序
优先队列成员函数
empty //判断队列是否为空
size //返回队列大小
top //访问队列顶部元素
push //插入元素
emplace //构造并且插入元素
pop //删除队列顶部元素
swap //交换内容
初始化一个优先队列
priority_queue<Type, Container, Functional> que;
- Type:代表队列中的数据类型
- Container:容器,必须是用数组实现的容器,比如vector,deque等等,但不能用 list。默认是vector
- Functional:比较方式,升序排列还是降序排列
//升序排列,小顶堆
priority_queue <int, vector<int>, greater<int>> que;
//降序排列,大顶堆
priority_queue <int, vector<int>, less<int>> que;
//默认是大顶堆,降序排列
priority_queue <int> que;
举例
#include <iostream>
#include <queue>
using namespace std;
int main() {
//默认是大顶堆,降序排列
priority_queue<int> que1;
//等同于 priority_queue<int, vector<int>, less<int> > que1;
//小顶堆,升序排列
priority_queue<int, vector<int>, greater<int> > que2;
//大顶堆,降序排列
priority_queue<string> que3;
for (int i = 0; i < 5; i++) {
que1.push(i);
que2.push(i);
}
while (!que1.empty()) {
cout << que1.top() << ' ';
que1.pop();
}
cout << endl;
while (!que2.empty()) {
cout << que2.top() << ' ';
que2.pop();
}
cout << endl;
que3.push("abc");
que3.push("cbcd");
que3.push("bbd");
while (!que3.empty()) {
cout << que3.top() << ' ';
que3.pop();
}
cout << endl;
return 0;
}
编译
g++ test.cc -o a.out
输出
4 3 2 1 0
0 1 2 3 4
cbcd bbd abc
举例2,pair的比较,先比较第一个元素,第一个元素相等,再比较第二个元素
#include <iostream>
#include <queue>
#include <vector>
using namespace std;
int main() {
// 默认是大顶堆,降序排列
priority_queue<pair<int, int> > que;
pair<int, int> a(1, 2);
pair<int, int> b(1, 3);
pair<int, int> c(2, 5);
que.push(c);
que.push(b);
que.push(a);
while (!que.empty()) {
cout << que.top().first << ' ' << que.top().second << '\n';
que.pop();
}
}
输出
2 5
1 4
1 3
使用自定义的比较函数来初始化优先队列
class student{
public:
int age;
string name;
/**重载小于操作符,
*这里必须是非成员函数才可以
*/
friend bool operator<(const student& a, const student & b){
return a.age < b.age;
}
};
/**可调用的函数操作符的对象*/
struct mycmp{
bool operator()(const student & a,const student & b){
return a.age < b.age;
}
};
/**函数指针*/
bool cmpfunc(const student& a, const student& b){
return a.age < b.age;
}
/**默认使用student的oprator<来进行比较*/
priority_queue<student> que1;
/**使用重载函数操作符的类对象*/
priority_queue<student,vector<student>,mycmp> que2;
/**定义一下比较函数*/
auto cmp = [](const student & a,const student & b){return a.age < b.age;};
/**
* 需要把lambda表达式作为优先队列参数进行初始化
* 并且指定priority_queue的模板实参,decltype(cmp),c++11 declare type,声明类型
* 可以认为是确定函数的类型
* bool (const student & a,const student & b)
**/
priority_queue<student,vector<student>,decltype(cmp)> que4(cmp);
/*使用函数对象来定义这个比较函数原型*/
//lambda 函数来初始化函数对象
priority_queue<student,vector<student>,function<bool(const student&,const student&)>> que5(cmp);
//函数指针来初始化函数对象
priority_queue<student,vector<student>,function<bool(const student&,const student&)>> que6(cmpfunc);
/**函数对象*/
function<bool(const student&,const student &)> func(cmpfunc);
priority_queue<student,vector<student>,function<bool(const student&,const student&)>> que7(func);