优先队列与队列一样只能队尾进、队首出。但是其排列顺序并不是按入队先后,而是可以自己定义优先级,相当于自动排好序的队列。
基础
需要的头文件:
支持的操作:
1 2 3 4 5
| empty() pop() push() size() top()
|
虽然是叫“优先队列”,但个人感觉比较像栈……
简单元素排序
元素为数字时,默认按从大到小排。例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| #include<iostream> #include<queue> using namespace std; int main(){ ios::sync_with_stdio(false); priority_queue<int> a; a.push(2); a.push(1); a.push(34); a.push(9999); a.push(500); while (!a.empty()){ cout << a.top() << endl; a.pop(); } return 0; }
|
输出为:
如果要按从小到大排,需要将函数声明修改:
1
| priority_queue<int,vector<int>,greater<int>> a;
|
或者使用自己定义的比较函数:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
| #include<iostream> #include<queue> using namespace std; struct cmp1{ bool operator()(int &a,int &b){ return a > b; } };
struct cmp2{ bool operator()(int &a,int &b){ return a < b; } }; int main(){ ios::sync_with_stdio(false); priority_queue<int,vector<int>,cmp1> a; a.push(2); a.push(1); a.push(34); a.push(9999); a.push(500); while (!a.empty()){ cout << a.top() << endl; a.pop(); } return 0; }
|
同理,对于字符也可以用同样的方法排序。
结构体排序
对于结构体,需要在结构体定义时定义优先级。例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38
| #include<iostream> #include<queue> using namespace std; struct node{ friend bool operator< (node a, node b){ return a.priority < b.priority; } int priority; int other; }; int main(){ ios::sync_with_stdio(false); priority_queue<node> a; node now;
now.priority=2; now.other=1111; a.push(now); now.priority=1; now.other=2222; a.push(now); now.priority=34; now.other=3333; a.push(now); now.priority=9999; now.other=4444; a.push(now); now.priority=500; now.other=5555; a.push(now);
while (!a.empty()){ cout << a.top().priority << ' ' << a.top().other << endl; a.pop(); } return 0; }
|
输出结果为:
1 2 3 4 5
| 9999 4444 500 5555 34 3333 2 1111 1 2222
|
要改变排列顺序,只需要修改一个符号: return a.priority >
b.priority;
最后更新时间:
文章转载请标明出处,仅供学习使用。