定义在头文件 :
#include <queue>
为什么叫优先级队列呢,首先它是一个队列,然后在队列的基础上增加了一个排序的功能(也就是给元素赋予优先级),是基于堆实现的:数据结构与算法:28 | 堆和堆排序
形式是这样的:
priority_queue<Type, Container, Functional>
三个参数分别代表:元素类型,容器类型和比较器
- 元素类型:没什么好说的
- 容器类型:默认
vector,也可以是deque。 - 比较器:可调用对象,用于对元素的优先级进行比较,默认是
<
常见操作:
和队列操作类似:
top() 访问队头元素
empty() 队列是否为空
size() 返回队列内元素个数
push() 插入元素到队尾 (并自动进行堆化)
emplace() 原地构造一个元素并插入队列
pop() 弹出队头元素
swap() 交换内容
常见使用方式:
priority_queue<int> q; //定义一个大顶堆
priority_queue<int, vector<int>, less<int> > q;//也是大顶堆
priority_queue<int, vector<int>, greater<int> > q; //小顶堆
要写这篇文章主要也是想记录一下比较器的自定义:
如果我们使用优先级队列存储某种自定义类型。而默认的比较器不符合需求的时候,我们就需要自定义。
用自己做的题举个例子:leetcode 第 373 题:查找和最小的K对数字(C++)_zj-CSDN博客
定义的优先级队列是这样的:
struct cmp{
bool operator() (const pair<int, int> &a, const pair<int, int> &b) {
return nums1[a.first] + nums2[a.second] > nums1[b.first] + nums2[b.second];
}
};
priority_queue<pair<int, int>, vector<pair<int, int>>, cmp> q;
这样定义的cmp不能使用,原因是不能访问到数组 nums1和 nums2,定义成全局变量也不可以,后来看到了别人的实现:
auto cmp = [&nums1, &nums2](const pair<int, int> &a, const pair<int, int> &b) { return nums1[a.first] + nums2[a.second] > nums1[b.first] + nums2[b.second]; };
priority_queue<pair<int, int>, vector<pair<int, int>>, decltype(cmp)> q(cmp);
这样就可以了。暂时还不是很懂,后续懂了再回来写

1080

被折叠的 条评论
为什么被折叠?



