priority_queue(一)

本文介绍了Java中的PriorityQueue,一种基于优先级的无界队列,元素按自然顺序或自定义Comparator排序。它用于自动排序并适用于堆合并场景。队列不允许null元素和不可比较对象,且容量会自动扩展。

什么是priority_queue?

PriorityQueue 一个基于优先级的无界优先级队列。优先级队列的元素按照其自然顺序进行排序,或者根据构造队列时提供的 Comparator 进行排序,具体取决于所使用的构造方法。该队列不允许使用 null 元素也不允许插入不可比较的对象(没有实现Comparable接口的对象)。
PriorityQueue 队列的头指排序规则最小那哥元素。如果多个元素都是最小值则随机选一个。
PriorityQueue 是一个无界队列,但是初始的容量(实际是一个Object[]),随着不断向优先级队列添加元素,其容量会自动扩容,无需指定容量增加策略的细节。

简单来说,他就是一个可以内部自动排序的队列

对于堆的合并而言,他是一个不错的选择。

具体实战,请看下一篇

### C++ `priority_queue` 介绍 `priority_queue` 可以在队列中自定义数据的优先级,让优先级高的排在队列前面优先出队。它具有队列的所有特性,包括队列的基本操作,在这基础上添加了内部的个排序,本质是个堆实现的 [^4]。其定义如下: ```cpp template <class T, class Container = vector<T>, class Compare = less<typename Container::value_type> > class priority_queue; ``` 默认情况下,`priority_queue` 的 `top` 方法返回最大的元素 [^1][^3]。 ### 结合 Lambda 表达式的使用 由于 Lambda 表达式没有默认构造函数,`priority_queue` 内部排序比较时要使用的是个实例化的 Lambda 对象,只能通过 Lambda 的复制构造进行实例化,需要在 `priority_queue` 构造函数时传入这个 Lambda 对象。而 `struct` 和 `class` 都有默认构造函数,使用它们自定义比较时,不需要传入对象实例;使用函数自定义比较时,也需要提供函数对象进行实例化 [^2]。 以下是使用 Lambda 表达式自定义比较规则的示例: ```cpp #include <iostream> #include <queue> #include <vector> #include <utility> int main() { // 以 Pair 中第二个元素构建小根堆 auto cmp = [](const std::pair<int, int> &a, const std::pair<int, int> &b) { return a.second > b.second; // greater }; std::priority_queue<std::pair<int, int>, std::vector<std::pair<int, int>>, decltype(cmp)> q(cmp); q.push({1, 5}); q.push({2, 3}); q.push({3, 7}); while (!q.empty()) { std::cout << "(" << q.top().first << ", " << q.top().second << ")" << std::endl; q.pop(); } return 0; } ``` 上述代码使用 Lambda 表达式 `cmp` 定义了比较规则,使得 `priority_queue` 按照 `pair` 中第二个元素构建小根堆。 ### 原理 `priority_queue` 在插入和删除元素时,会根据传入的比较器(如 Lambda 表达式)来维护堆的性质,以保证堆顶元素是优先级最高的元素。当使用 Lambda 表达式作为比较器时,`priority_queue` 会在内部调用这个 Lambda 表达式来比较元素的大小,从而进行堆的调整。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值