优先队列概念
优先队列是队列的一种,不过它可以按照自定义的一种方式(数据的优先级)来对队列中的数据进行动态的排序每次的push和pop操作,队列都会动态的调整,以达到我们预期的方式来存储。例如:我们常用的操作就是对数据排序,优先队列默认的是数据大的优先级高所以我们无论按照什么顺序push一堆数,最终在队列里总是top出最大的元素。
优先队列的基本操作
优先级队列支持的操作 |
q.empty() 如果队列为空,则返回true,否则返回false q.size() 返回队列中元素的个数 q.pop() 删除队首元素,但不返回其值 q.top() 返回具有最高优先级的元素值,但不删除该元素 q.push(item) 在基于优先级的适当位置插入新元素 |
优先队列的优先值设置
优先队列也是用 #include<queue>
这个头文件,且不必引入vector的头文件
1. 基础类型优先级设置
默认定义:
priority_queue<int>
大顶堆
手工设置:
priority_queue<int, vector<int>, less<int>>
大顶堆:表示其他都比堆顶小priority_queue<int, vector<int>, greater<int>>
小顶堆:表示其他都比堆顶大
后面补充的两个参数:内部用容器+规则。
既然默认是大顶堆,所以手动设置时只用管小顶堆即可,greater!.
2. 结构体设置优先级:
只可在结构体内部重载小于号
两种重置用法:
-
- 运算符重载 + 友元
struct node
{
int one;
int two;
friend bool operator < (node x,node y)
{
return x.one<y.two;//这是大顶堆,反之则是小顶堆
}
};
priority_queue<node> Q;//调用
- 比较运算符外置
struct node
{
int one;
int two;
};
struct cmp
{
bool operator()(node x,node y)
{
return x.one<y.two;//大顶堆
}
};
priority_queue < node,vector<node> , cmp > Q;