【C++】priority_queue优先队列

头文件#include <queue>

优先队列具有队列的所有特性,本质是一个堆实现的,和队列基本操作相同:

top 访问队头元素

empty 队列是否为空

size 返回队列内元素个数

push 插入元素到队尾 (并排序)

emplace 原地构造一个元素并插入队列

pop 弹出队头元素

swap 交换内容

和队列不一样的是,优先队列没有 front() 函数与 back() 函数,而只能通过 top() 函数来访问队首元素(也可以称为堆顶元素),也就是优先级最高的元素。

定义方式有两种

  1. typename 可以是任意基本数据类型或容器:

    priority_queue< typename > name;

  2. 定义:priority_queue<Type, Container, Functional>
    Type 数据类型,Container 容器类型(Container必须是用数组实现的容器,比如vector,deque等等,但不能用 list。STL里面默认用的是vector),Functional 就是比较的方式,当需要用自定义的数据类型时才需要传入这三个参数,使用基本数据类型时,只需要传入数据类型,默认是大顶堆。
    注意第二个参数填写的是来承载底层数据结构堆(heap)的容器,如果第一个参数是 double 型或 char 型,则此处只需要填写 vector 或 vector;
    而第三个参数 则是对第一个参数的比较类,less 表示数字大的优先级越大,而 greater 表示数字小的优先级越大。也可以自定义数据比较关系

对基本数据类型来说,下面两种优先队列的定义是等价的(以 int 型为例,注意最后两个 > 之间有一个空格):

复制代码
priority_queue<int> q;
priority_queue<int,vector<int>,less<int>> q;

如果想让优先队列总是把最小的元素放在队首,则需进行如下定义:

复制代码
priority_queue<int,vector<int>,greater<int>>q;

如果不是基本类型,那么结构体的优先级设置方法有所区别需要重载小于号"<" 例如

复制代码
struct student
{
    string name;
    int age;
    friend bool operator <(student s1,student s2)
    {
        return student.age <student.age;
    }
};

重载大于号会编译错误,因为从数学上来说只需要重载小于号,即 f1 > f2 等价于判断 f2 < f1,而 f1 == f2 则等价于判断!(f1<f2) &&!(f2<fl))

如果想把重载写在变量结构体外面则需要重载小括号()同时将其用struct包装起来,例如

复制代码
struct ListNode {
    int val;
    ListNode *next;
    ListNode() : val(0), next(nullptr) {}
    ListNode(int x) : val(x), next(nullptr) {}
    ListNode(int x, ListNode *next) : val(x), next(next) {}
}
struct comp{
    bool operator() (ListNode *L1,ListNode *L2){
        return L1->val > L2->val;
    }
};
priority_queue<ListNode*,vector<ListNode*>,comp> q;
相关推荐
AAIshangyanxiu23 分钟前
涡度通量碳观测数据 MATLAB 全流程解析与敏感性定量分析、观测数据质控、插补及 footprint 建模技术
开发语言·matlab·涡度通量·生态碳汇·生态碳汇模拟
小短腿乄30 分钟前
java实现pdf加水印+签名
java·开发语言·pdf
郝学胜-神的一滴42 分钟前
中级OpenGL教程 030:gl_FragCoord解锁区域渲染与深度可视化新姿势
c++·unity·游戏引擎·图形渲染·unreal engine·opengl
聆风吟º1 小时前
【金仓数据库征文】Java 应用接入金仓数据库:从驱动、连接池到存储过程调试的踩坑实录
java·开发语言·数据库
不会代码的小猴1 小时前
11. 类和动态内存分配
开发语言·c++
似璟如你2 小时前
Java 开发者的 Go 语法基础:从 0 开始快速上手 Go
java·开发语言·后端·golang·go·编程语言
鱼子星_2 小时前
【C++】stack和queue的应用及其模拟实现:适配器与容器适配器
数据结构·c++·笔记·stl
LccKyI2 小时前
C#学习day05(开发福彩双色球系统附思维导图)
开发语言·学习·c#
zzz_23682 小时前
TencentDB-Agent-Memory 深度解析:让多个 Agent 共享项目经验的记忆中枢
java·开发语言·jvm·人工智能·agent·memory·tencent db
jufeng13072 小时前
【系列:MiniKV 原理剖析 · 第 2 篇】
linux·c++·软件工程