首先说明一点,C++中stack和queue并不是容器,只是一套接口。内部用什么容器来实现是可以指定的,默认是stack<T, deque<T>>和queue<T, deque<T>>,也可以用stack<T, vector<T>>等等
下面是具体用法
#include<queue>//头文件
priority_queue<int> que;//定义
que.push(x);//插入元素x
cout << que.size();//元素个数
while (!que.empty()) {//是否为空
cout << que.top() <<endl;//堆顶元素
que.pop();//pop堆顶元素
}
默认是用大顶堆实现优先队列
如接连push 9,8,0,-5,1后会输出9,8,1,0,-5
若想改为小顶堆,可以设置greater参数(默认是less,大顶堆);如果想用vector存储,也可以自己设定,如下所示
priority_queue<int,vector<int>,greater<int>> que;
//这边 greater对应小顶堆,默认参数是less,对应大顶堆;
//vector是自己设定的存储数据的容器
此外,也可以自定义元素类型,这里需要对运算符进行重载,否则会报错
struct node{
int x,y;
bool operator< (const node &b)const {
return this->x < b.x;
}
};
priority_queue<node> que;
que.push((node){x,y});
如相继push(node){1,9}、(node){3,6}、(node){-2,4}、(node){8,2}后
不断输出que.top().x同时que.pop(),会输出8,3,1,-2,按照降序排列
若想从小到大排,可以修改重载函数,将"this->x < b.x"改成"this->x > b.x"
bool operator< (const node &b)const {
return this->x > b.x;
}
想看视频演示的可以参考b站视频,讲的很清楚,C++-STL-priority_queue(堆/优先队列)的简单使用_哔哩哔哩_bilibili