priority_queue 容器适配器为了保证每次从队头移除的都是当前优先级最高的元素,每当有新元素进入,它都会根据既定的排序规则找到优先级最高的元素,并将其移动到队列的队头;同样,当 priority_queue 从队头移除出一个元素之后,它也会再找到当前优先级最高的元素,并将其移动到队头。基于 priority_queue 的这种特性,因此该容器适配器有被称为优先级队列。
1.语法
priority_queue< 数据类型,vector<数据类型>,class Compare = less<typename Container::value_type> > que;
注意: < 参数1,vector<参数1> ,比较方式>
参数1为数据类型
*****比较方式: 必须得是一个类或者结构体内的一个对象比较方式
例:
#include<iostream>
#include<queue>
using namespace std;
struct cmp //必须是类或结构体的一个函数 而不能是一个普通的全局函数
{
bool operator() (int a,int b)
{
return a<b;
}
};
/* bool cmp(int a,int b)
{ return a<b ; } */ 普通的成员函数是不允许的
int main()
{
priority_queue<int,vector<int>,cmp> q;
q.push(1);
q.push(2);
q.push(3);
cout<<q.top();
}
2.分类
·1.大根堆
特点 : 堆顶为该优先队列中值最大的 整个队列按照降序排序 (该方式也是优先队列的默认方式)
表示形式:priority_queue<int,vector<int>,less<int>> 或priority_queue<int>(默认形式)
自定义排序方式
struct cmp
{
bool operator() (int a,int b)
{
return a<b; //这里的大于号或小于号为数据结构的定义 无需理解 特殊记忆
//小于号为大根堆 大于号为小根堆
}
};
·2.小根堆
特点 : 堆顶为该优先队列中值最小的 整个队列按照升序排序
表示形式:priority_queue<int,vector<int>,greater<int>>
自定义排序方式
struct cmp
{
bool operator() (int a,int b)
{
return a>b; //这里的大于号或小于号为数据结构的定义 无需理解 特殊记忆
//小于号为大根堆 大于号为小根堆
}
};
3.优先队列的数据处理
.size() 队列大小
.push() 插入数据
.pop() 弹出(堆顶)数据
.top() 堆顶数据
.empty() 队列是否为空
4.结合结构体使用
#include<iostream>
#include<queue>
using namespace std;
struct person
{
int id,money;
}
struct cmp
{
bool operator() (person a,person b)
{
return a.money<b.money ||(a.money==b.money&&a.id>b.id);
//按照先钱多排 钱一样的按序号小的排
}
};
int main()
{
priority_queue<int,vector<int>,cmp> q;
q.push({1,1});
q.push({2,3});
q.push({3,0});
cout<<q.top();
}