关于优先级队列(C++)

定义在头文件 :

#include 

为什么叫优先级队列呢,首先它是一个队列,然后在队列的基础上增加了一个排序的功能(也就是给元素赋予优先级),是基于堆实现的:数据结构与算法:28 | 堆和堆排序

形式是这样的:

priority_queue

三个参数分别代表:元素类型,容器类型和比较器

  • 元素类型:没什么好说的
  • 容器类型:默认vector,也可以是deque
  • 比较器:可调用对象,用于对元素的优先级进行比较,默认是 <

常见操作:

和队列操作类似:
	top() 访问队头元素
	empty() 队列是否为空
	size() 返回队列内元素个数
	push() 插入元素到队尾 (并自动进行堆化)
	emplace() 原地构造一个元素并插入队列
	pop() 弹出队头元素
	swap() 交换内容

常见使用方式:

priority_queue q; //定义一个大顶堆
priority_queue, less > q;//也是大顶堆
priority_queue, greater > q; //小顶堆

要写这篇文章主要也是想记录一下比较器的自定义:

如果我们使用优先级队列存储某种自定义类型。而默认的比较器不符合需求的时候,我们就需要自定义。

用自己做的题举个例子:leetcode 第 373 题:查找和最小的K对数字(C++)_zj-CSDN博客

定义的优先级队列是这样的:

struct cmp{
    bool operator() (const pair &a, const pair &b) {
        return nums1[a.first] + nums2[a.second] > nums1[b.first] + nums2[b.second]; 
    }
};

priority_queue, vector>, cmp> q;

这样定义的cmp不能使用,原因是不能访问到数组 nums1和 nums2,定义成全局变量也不可以,后来看到了别人的实现:

auto cmp = [&nums1, &nums2](const pair &a, const pair &b) { return nums1[a.first] + nums2[a.second] > nums1[b.first] + nums2[b.second]; };
priority_queue, vector>, decltype(cmp)> q(cmp);

这样就可以了。暂时还不是很懂,后续懂了再回来写

你可能感兴趣的:(数据结构与算法,数据结构)