/*STL库——优先级队列priority_queue
1、priority_queue是一种能根据元素优先级进行一系列操作的队列。
注:时间复杂度为O(logn)
2、优先队列声明的基本格式:
priority_queue<结构类型> 队列名这里默认为从大到小排列
注:这里的结构类型:可以为任何类型,包括结构体,那么这样一来,就可以通过在结构体中重载运算符,达到对结构体排序的目的。
priority_queue<int , vector<int>,greater<int> > 队列名,这里用的是小根堆,所以从小到大排列
priority_queue<int , vector<int>,less<int> > 队列名 与上一个相反,这里四从大到小排列
3、优先级队列和队列一样支持一下操作:
q.size():返回q里元素个数
q.empty():返回q是否为空,空则返回true
q.push(k):在q的末尾插入k
q.pop():删除q的第一个元素
q.top():查询q的第一个元素
4、优先队列 与 前面的set和map一样,有个很重要的功能:自动排序
[参考](https://blog.csdn.net/c20182030/article/details/70757660?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522162763135416780271515343%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=162763135416780271515343&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~sobaiduend~default-1-70757660.pc_search_result_before_js&utm_term=%E3%80%90%E5%8E%9F%E5%88%9B%E3%80%91%E4%BC%98%E5%85%88%E9%98%9F%E5%88%97+priority_queue+%E8%AF%A6%E8%A7%A3&spm=1018.2226.3001.4187)
----------
*/
//priority_queue使用示例
//基本的压入,弹出操作.
#include<iostream>
#include<queue>//优先级队列,与队列 一样都是用这个头文件
using namespace std;
int main()
{
priority_queue<int> q;
priority_queue<int , vector<int>,greater<int> > q1;
priority_queue<int , vector<int>,less<int> > q2;
//默认情况:
q.push(5);
q.push(2);
q.push(6);
q.push(8);
cout<<endl;
while(!q.empty())
{
cout<<q.top()<<" ";//这里的查询第一个元素函数为top(),与队列里的front(),不同。
q.pop();
}
cout<<"q : "<<q.empty()<<endl;
//小根堆情况:
q1.push(5);
q1.push(2);
q1.push(6);
q1.push(8);
cout<<endl;
while(!q1.empty())
{
cout<<q1.top()<<" ";
q1.pop();
}
cout<<"q1: "<<q1.empty()<<endl;
//大根堆情况:
q2.push(5);
q2.push(2);
q2.push(6);
q2.push(8);
cout<<endl;
while(!q2.empty())
{
cout<<q2.top()<<" ";
q2.pop();
}
cout<<"q2: "<<q2.empty()<<endl;
/*结果:
q : 8 6 5 2 q : 1
q1: 2 5 6 8 q1: 1
q2: 8 6 5 2 q2: 1
*/
system("pause");
return 0;
}
----------
//结构体内部的重载运算符
#include<iostream>
#include<queue>
using namespace std;
struct node
{
int x ,y;
bool operator < (const node & a) const
{
return x<a.x;//这种的重载方式并没有改变"<"的运算规则
}
}k;
priority_queue <node> q;
int main()
{
k.x=10,k.y=100; q.push(k);
k.x=12,k.y=60; q.push(k);
k.x=14,k.y=40; q.push(k);
k.x=6,k.y=80; q.push(k);
k.x=8,k.y=20; q.push(k);
while(!q.empty())
{
node m=q.top(); q.pop();
printf("(%d,%d) ",m.x,m.y);
}
//所以最后的结果,与没有重载前是一样的,都是从大到小的默认排序.
/*结果
(14,40) (12,60) (10,100) (8,20) (6,80)
*/
system("pause");
return 0;
}
看明白了,🐮🍺