简述
普通的队列是一种先进先出的数据结构,元素在队列尾追加,而从队列头删除。在优先队列中,元素被赋予优先级。当访问元素时,具备最高优先级的元素最早删除。优先队列具备最高级先出 (first in, largest out)的行为特征。一般采用堆数据结构来实现,其在插入数据会自动排序。html
头文件
#include<queue>
声明
priority_queue<T, Cotainer,Compare>ios
T | - | 存储的元素类型。 |
Container | - | 用于存储元素的底层容器类型。 |
Compare | - | 提供严格弱序的比较 (Compare) 类型。 |
priority_queue <int> i; priority_queue <double> d; //后两个不声明默认容器vector,函数less(优先级从小到大)
基本函数
q.size();//返回q里元素个数 q.empty();//返回q是否为空,空则返回true,不然返回false q.push();//插入元素,并对底层容器排序 q.pop();//删掉q的第一个元素 q.top();//返回q的第一个元素
#include<iostream> #include<queue> using namespace std; int main() { priority_queue<int> q; for(int i=5;i>=0;--i) q.push(i); cout<<"元素个数为:"<<q.size()<<endl; for(int i=0;i<6;++i) { cout<<q.top()<<endl; q.pop(); } return 0; }
运行结果
构造优先级
声明优先队列时默认是less,如何改变优先级呢?数据结构
priority_queue<int,vector<int>,less<int> > q;//默认 priority_queue<int,vector<int>,greater<int> > q;
less优先级是栈顶元素从大到小,而greater正好与其相反。less
还可根据本身需求构造函数
#include<iostream> #include<queue> #include<cstdlib> using namespace std; struct Node { int x,y; Node(int a=0, int b=0): x(a), y(b) {} }; struct cmp { bool operator()(Node a, Node b) { if(a.x == b.x) return a.y>b.y; return a.x>b.x; } }; int main() { priority_queue<Node, vector<Node>, cmp> p; for(int i=0; i<5; ++i) p.push(Node(rand(), rand())); while(!p.empty()) { cout<<p.top().x<<' '<<p.top().y<<endl; p.pop(); } return 0; }