引言:
c++因为有了STL库所以变得比c语言简单了许多,许多容器不需要自己实现,但是自己必须要熟悉掌握。在STL中有各种你想要的容器及函数,在解决问题中用恰当的容器和函数会有事半功倍的效果。今天就要介绍一下c++最常用的容器之一priority_queue的相关操作。
什么是优先队列?
优先级队列是一个容器适配器,它提供对最大(默认)元素的恒定时间查找。它提供了快速查找的功能,但是牺牲了插入和删除的时间。
可以提供用户提供的比较以更改顺序,例如 使用std :: greater 会使最小的元素显示为top()。
使用priority_queue类似于在某些随机访问容器中管理堆,其好处是不会意外使堆无效。
时间复杂度 | 队列 | 优先队列 |
---|---|---|
插入 | O(1) | O(log n) |
删除 | O(1) | O(log n) |
查询 | O(n) | O(log n) |
如何使用
#include<queue>
using namespace std;
优先队列的创建:
priority_queue<int> q;
priority_queue<pair<int,int>> q;
priority_queue<int, vector<int>, greater<int> > q;//小顶堆,优先输出小数据
priority_queue<int, vector<int>, less<int> > q;//大顶堆,优先输出大数据
priority_queue<Type, Container, Functional>/*Type为数据类型, Container为保存数据的容器,
Functional为元素比较方式。如果不写后两个参数,那么容器默认用的是vector,比较方式默认用
operator<,也就是优先队列是大顶堆,队头元素最大。*/
相关函数:
q.empty();//是否为空
q.size(); //获取当前的大小
q.top(); //获取堆顶的元素
q.pop();//删除堆顶元素
q.push(int a);//插入元素并排序
q.emplace(int a,int b); //就地构造元素并排序
例子:
#include<iostream>
#include<queue>
using namespace std;
struct cmp{ //优先输出较小数
bool operator()(int a, int b){
return a>b;
}
};
int main(){
priority_queue<int,vector<int>,cmp> q;
priority_queue<pair<int,int> > p;
q.push(1);
q.push(5);
q.push(10);
q.push(6);
while(!q.empty()){
cout<<q.top()<<endl; //输出为1 5 6 10
q.pop();
}
return 0;
}