priority_queue(优先队列)容器介绍
优先队列是在正常队列的基础上加了优先级,保证每次的队首元素都是优先级最大的。
每次操作队列中的元素都是按优先级排序的。
(你可以用它来排序,但是sort一般就可以排序,他的用处一般是在每次对序列进行增 删 改 的操作时,优先队列还能按优先级排序)
(比如一个优先队列 6 4 2 1 0 加入一个值5,优先队列就是6 5 4 2 1 0)
它的底层是通过堆来实现的。
//头文件
#include<queue>
//初始化定义
priority_queue<int>pq;
代码 | 含义 |
---|---|
top() | 访问队首元素 |
push() | 入队 |
pop() | 堆顶(队首)元素出队 |
size() | 队列元素个数 |
empty() | |
注意没有clear()! | 不提供该方法 |
优先队列只能通过top()访问队首元素(优先级最高的元素) |
(1) 基本数据类型的优先级
priority_queue<int, vector<int>, less<int> >pq;
//最后两个>之间要有空格
解释:
第二个参数:
vector< int > 是用来承载底层数据结构堆的容器,若优先队列中存放的是double型数据,就要填vector< double >
总之存的是什么类型的数据,就相应的填写对应类型。
第三个参数:
less< int > 表示数字大的优先级大,堆顶为最大的数字
greater< int >表示数字小的优先级大,堆顶为最小的数字
int代表的是数据类型,也要填对应的类型
自定义排序:
struct cmp1
{
bool operator()(int x,int y)
{
return x>y;//小的优先级高 ,从小到大排
}
};
struct cmp2
{
bool operator()(const int x,const int y)
{
return a[x]>a[y];
}
};
priority_queue<int,vector<int>,cmp1>pq1;
priority_queue<int,vector<int>,cmp2>pq2;
(2)结构体(或自定义)优先级设置
优先级设置可以定义在结构体内进行小于号重载,也可以定义在结构体外,下面演示定义在外面的简单写法,详情大家可以搜索相关博客进行了解。
//要排序的结构体(存储在优先队列里面的)
struct node
{
int x,y;
};
版本一:
//定义的比较结构体
//注意:cmp是个结构体
struct cmp
{//自定义堆的排序规则
bool operator()(const node& a,const node& b)
{
return a.x>b.x;//从堆底到堆顶 降序排序
}//如果要升序改变不等号方向就好
};
//初始化定义,
priority_queue<node,vector<node>,cmp >pq;
版本二:不用写关的参数,直接在node里面写
因为是在node里面自定义的规则,所以是node里面的值自动排了,并不需要cmp结构体了
struct node
{
int x,y;
friend bool operator<(node a,node b)
{//为两个结构体参数,结构体调用一定要写上friend
return a.x>b.x;//按x从小到大排
}
};
或者:
struct node
{
bool operator < (const node& a) const
{//直接传入一个参数,不必要写friend
return x > a.x;//优先级大的为x小的值,升序排列
}
};
优先队列的定义
priority_queue<node>pq4;
注意: 优先对列自定义排序规则和sort()函数定义cmp函数很相似,但是最后返回的情况是相反的。即相同的符号,最后定义的排列顺序是完全相反的。
所以只需要记住sort的排序规则和优先队列的排序规则是相反的就可以了
(1)存储pair类型
排序规则:
默认先对pair的first进行降序排序,然后再对second降序排序
对first先排序,大的排在前面,如果first元素相同,再对second元素排序,保持大的在前面
#include<bits/stdc++.h>
using namespace std;
int main()
{
priority_queue<pair<int,int> >q;
q.push({7,8});
q.push({7,9});
q.push(make_pair(8,7));
while(!q.empty())
{
cout<<q.top().first<<" "<<q.top().second<<endl;
q.pop();
}
return 0;
}
结果:
8 7
7 9
7 8
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 如何调用 DeepSeek 的自然语言处理 API 接口并集成到在线客服系统
· 【译】Visual Studio 中新的强大生产力特性
· 2025年我用 Compose 写了一个 Todo App