priority_queue优先队列
在学习了堆优化的迪杰斯特拉时,学了优先队列,发现非常好用。QAQ之前应该早点学的,哎,自己又菜又懒,咸鱼王无疑了。学习知识点记录下来!
优先队列就是将队列中的元素赋予优先级,在访问优先队列中的元素时,具有最高优先级的元素先被访问。队列时先进先出,而优先队列是优先级最高的先出。
初始化:需要 头文件 #include<queue>
priority_queue<Type, Container, Functional>
Type 就是数据类型,Container 就是容器类型(Container必须是用数组实现的容器,比如vector,deque等等,但不能用 list。STL里面默认用的是vector),Functional 就是比较的方式,当需要用自定义的数据类型时才需要传入这三个参数,使用基本数据类型时,只需要传入数据类型,默认是大顶堆
一般是:
priority_queue <int,vector<int>,greater<int> > q; //升序队列 priority_queue <int,vector<int>,less<int> >q; //降序队列 Priority_queue<node>q; // node为结构体,可以自定义优先级
基本操作:
empty( ) //判断一个队列是否为空 pop( ) //删除队顶元素 push( ) //加入一个元素 size( ) //返回优先队列中拥有的元素个数 top( ) //返回优先队列的队顶元素
代码
#include<iostream> #include<queue> using namespace std; int main() { priority_queue<int,vector<int>,greater<int> >q1; //升序队列 priority_queue<int,vector<int>,less<int> >q2; //降序队列 int a[5]={4,5,2,1,3}; for(int i=0;i<5;i++) { q1.push(a[i]); q2.push(a[i]); } cout<<"升序队列"<<endl; while(!q1.empty()) { cout<<q1.top()<<' '; q1.pop(); } cout<<endl; cout<<"降序队列"<<endl; while(!q2.empty()) { cout<<q2.top()<<' '; q2.pop(); } return 0; }
//自定义优先级 #include<iostream> #include<queue> using namespace std; struct node { int x,y; node(){} node(int a,int b) { x=a;y=b; } operator < (const node &rhs)const { return x>rhs.x; //x大的优先级高 // return y>rhs.y; //y大的优先级高 } }; int main() { priority_queue<node>q; q.push(node(3,1)); q.push(node(2,2)); q.push(node(4,3)); q.push(node(5,4)); q.push(node(1,5)); while(!q.empty()) { node temp=q.top(); q.pop(); cout<<temp.x<<' '<<temp.y<<endl; } return 0; }
参考:
https://blog.csdn.net/ac_gibson/article/details/44200411
https://blog.csdn.net/weixin_36888577/article/details/79937886