C++ priority_queue

news2025/1/10 11:49:44

C++ priority_queue

在这里插入图片描述

📟作者主页:慢热的陕西人

🌴专栏链接:C++

📣欢迎各位大佬👍点赞🔥关注🚓收藏,🍉留言

本博客主要内容讲解了优先队列的对应接口的使用

文章目录

  • C++ priority_queue
    • 1. priority_queue的介绍和使用
    • 2. priority_queue的使用
    • 3.相关的oj题

1. priority_queue的介绍和使用

首先我们可以将priority_queue理解为我们在数据结构中学习的堆,但是这里个人觉得是堆的升级版,因为它的名字叫”优先“队列。

也就是**说我们可以人为的控制堆中的元素是以何种方式比较**。

也可以阅读priority_queue的官方文档

以下是priority_queue 的相关介绍:

  • 优先队列是一种容器适配器,根据严格的弱排序标准,它的第一个元素总是它所包含的元素中最大的。

  • 此上下文类似于堆,在堆中可以随时插入元素,并且只能检索最大堆元素(优先队列中位于顶部的元素)。

  • 优先队列被实现为容器适配器,容器适配器即将特定容器类封装作为其底层容器类,queue提供一组特定的成员函数来访问其元素。元素从特定容器的“尾部”弹出,其称为优先队列的顶部。

  • 底层容器可以是任何标准容器类模板,也可以是其他特定设计的容器类。容器应该可以通过随机访问迭代器访问,并支持以下操作:

    • empty():检测容器是否为空
    • size():返回容器中有效元素个数
    • front():返回容器中第一个元素的引用
    • push_back():在容器尾部插入元素
    • pop_back():删除容器尾部元素
  • 标准容器类vector和deque满足这些需求。默认情况下,如果没有为特定的priority_queue类实例化指

    定容器类,则使用vector。

  • 需要支持随机访问迭代器,以便始终在内部保持堆结构。容器适配器通过在需要时自动调用算法函数

make_heap、push_heap和pop_heap来自动完成此操作。

2. priority_queue的使用

优先级队列默认使用vector作为其底层存储数据的容器,在vector上又使用了堆算法将vector中元素构造成堆的结构,因此priority_queue就是堆,所有需要用到堆的位置,都可以考虑使用priority_queue。注意:默认情况下priority_queue是大堆。

函数声明接口说明
priority_queue()/priority_queue(first, last)构造一个空的优先级队列/使用迭代器构造一个非空优先级队列
empty()判断当前优先级队列是否为空
top()返回堆顶元素即最大/最小元素
push(x)在优先级队列中插入元素x
pop()删除堆顶的元素即最大/最小的元素

【注意】

1.默认情况下,priority_queue是大堆。

#include <vector>
#include <queue>
#include <functional> // greater算法的头文件
void TestPriorityQueue()
{
 // 默认情况下,创建的是大堆,其底层按照小于号比较
 vector<int> v{3,2,7,6,0,4,1,9,8,5};
 priority_queue<int> q1;
 for (auto& e : v)
 q1.push(e);
 cout << q1.top() << endl;
 // 如果要创建小堆,将第三个模板参数换成greater比较方式
 priority_queue<int, vector<int>, greater<int>> q2(v.begin(), v.end());
 cout << q2.top() << endl;
}

2.当我们想在priority_queue中放入自定义类型,那么我们需要在自定义类型中给出<或者>的重载

class Date
{
public:
 Date(int year = 1900, int month = 1, int day = 1)
 : _year(year)
 , _month(month)
 , _day(day)
 {}
 bool operator<(const Date& d)const
 {
 return (_year < d._year) ||
 (_year == d._year && _month < d._month) ||
 (_year == d._year && _month == d._month && _day < d._day);
 }
 bool operator>(const Date& d)const
 {
 return (_year > d._year) ||
 (_year == d._year && _month > d._month) ||
 (_year == d._year && _month == d._month && _day > d._day);
 }
 friend ostream& operator<<(ostream& _cout, const Date& d)
 {
 _cout << d._year << "-" << d._month << "-" << d._day;
 return _cout;
 }
private:
 int _year;
 int _month;
 int _day;
};
void TestPriorityQueue()
{
 // 大堆,需要用户在自定义类型中提供<的重载
 priority_queue<Date> q1;
 q1.push(Date(2018, 10, 29));
 q1.push(Date(2018, 10, 28));
 q1.push(Date(2018, 10, 30));
 cout << q1.top() << endl;
 // 如果要创建小堆,需要用户提供>的重载
 priority_queue<Date, vector<Date>, greater<Date>> q2;
 q2.push(Date(2018, 10, 29));
 q2.push(Date(2018, 10, 28));
 q2.push(Date(2018, 10, 30));
 cout << q2.top() << endl;
}

3.相关的oj题

215. 数组中的第K个最大元素 - 力扣(LeetCode)

到这本篇博客的内容就到此结束了。
如果觉得本篇博客内容对你有所帮助的话,可以点赞,收藏,顺便关注一下!
如果文章内容有错误,欢迎在评论区指正

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/580826.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

APT(Advanced Persistent Threat高级持续性威胁)——网络安全

APT&#xff08;高级持续性威胁&#xff09; 特点攻击过程防御策略与APT相关的加密技术&#xff08;学习侧重&#xff09; 网络安全APT&#xff08;Advanced Persistent Threat高级持续性威胁&#xff09;是一种复杂的网络攻击&#xff0c;旨在长期潜伏在目标网络中&#xff0c…

【线程池】Java线程池的核心参数

目录 一、简介 二、构造方法 三、线程池的核心参数 3.1 corePoolSize 线程池核心线程大小 3.2 maximumPoolSize 线程池最大线程数量 3.3 keepAliveTime 空闲线程存活时间 3.4 unit 空间线程存活时间单位 3.5 workQueue 工作队列 ①ArrayBlockingQueue ②LinkedBlocki…

嵌入式Linux中pinctrl 子系统和 gpio 子系统分析

目录 1、gpio 子系统 API 2、pinctrl 子系统 API 本文讲解 pinctrl 子系统和 gpio 子系统的 API&#xff0c;以及使用示例。 传统的配置 pin 的方式就是直接操作相应的寄存器&#xff0c;但是这种配置方式比较繁琐、而且容易出问题(比如 pin 功能冲突)。pinctrl 子系统就是为…

Linux :: 【基础指令篇 :: 文件及目录操作:(2)】::Linux操作系统的文件“框架”、绝对路径与相对路径及路径定位文件对象的解释

前言&#xff1a;本篇是 Linux 基本操作篇章的内容&#xff01; 笔者使用的环境是基于腾讯云服务器&#xff1a;CentOS 7.6 64bit。 学习集&#xff1a; C 入门到入土&#xff01;&#xff01;&#xff01;学习合集Linux 从命令到网络再到内核&#xff01;学习合集 本篇内容&am…

Linux常见IO模型

这篇博客开始我们Linux的最后一个章节--常见IO模型&#xff0c;在之前的博客当中我们讲述过Linux中基础的IO操作&#xff0c;欢迎大家去阅读。 我们通常指的IO操作便是数据的输入和输出&#xff0c;对应的具体操作过程我们可以将其分为两个步骤&#xff1a;等待IO就绪和数据拷…

Eclipse教程 Ⅵ

今天分享Eclipse Java 构建路径、Eclipse 运行配置(Run Configuration)和Eclipse 运行程序 Eclipse Java 构建路径 设置 Java 构建路径 Java构建路径用于在编译Java项目时找到依赖的类&#xff0c;包括以下几项&#xff1a; 源码包项目相关的 jar 包及类文件项目引用的的类…

postgresql 内核源码分析 语法解析 gram.y

专栏内容&#xff1a;postgresql内核源码分析个人主页&#xff1a;我的主页座右铭&#xff1a;天行健&#xff0c;君子以自强不息&#xff1b;地势坤&#xff0c;君子以厚德载物&#xff0e; 目录 前言 概述 流程简介 调用流程 语法解析详细分解 raw_parser的主流程 词法…

Wireshark使用手册

目录 前言 Wireshark不能做的 Wireshark VS Fiddler 同类的其他工具 什么人会用到wireshark wireshark 开始抓包 Wireshark 窗口介绍 Wireshark 显示过滤 保存过滤 过滤表达式的规则 封包列表(Packet List Pane) 封包详细信息 (Packet Details Pane) wireshark与…

【CVPR_2023论文精读】E4S: Fine-grained Face Swapping via Regional GAN Inversion

【CVPR_2023论文精读】E4S: Fine-grained Face Swapping via Regional GAN Inversion 0、前言Abstract1. Introduction2. Related Work2.1 GAN Inversion2.2 Face Swapping 3. Methodology3.1. Editing-for-Swapping (E4S) Framework3.1.1 Reenactment.3.1.2 Swapping and Gene…

学习:双重差分模型DIDPSM-基于Stata实现

双重差分模型 定义 双重差分法&#xff08;Difference in Differences&#xff09;: 通过利用观察学习的数据&#xff0c;计算自然实验中“实验组”与“对照组”在干预下增量的差距。 步骤&#xff1a; 分组&#xff1a;对于一个自然实验&#xff0c;其将全部的样本数据分为…

JMeter性能测试101:一步一步教你如何开始

1. Jmeter简介 Apache JMeter是一款纯java编写负载功能测试和性能测试开源工具软件。相比Loadrunner而言&#xff0c;JMeter小巧轻便且免费&#xff0c;逐渐成为了主流的性能测试工具&#xff0c;是每个测试人员都必须要掌握的工具之一。 2023年最新版Jmeter性能测试项目实战…

FFmpeg5.0源码阅读——mov文件格式解析

摘要&#xff1a;之前在Mp4格式详解中详细描述了Mp4文件格式的具体布局方式。为了更加深入理解mp4文件格式&#xff0c;本文记录了ffmpeg中解封装mp4文件的基本实现。关键字:mov、FFmpeg、mp4 1 简介 mp4文件格式是现如今网络上最常见的视频文件格式&#xff0c;其和mov等格式…

复合查询.

基本查询 查询工资高于500或岗位为MANAGER的雇员&#xff0c;同时还要满足他们的姓名首字母为大写的J select * from EMP where (sal>500 or jobMANAGER) and ename like J%;按照部门号升序而雇员的工资降序排序 select * from EMP order by deptno, sal desc;使用年薪进…

为建筑物的供暖系统实施MPC控制器的小型项目(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

【网络】- TCP/IP四层(五层)协议 - 网际层(网络层) - 路由控制

目录 一、概述二、路由表(Routing table)三、最长匹配、默认路由、特定主机路由四 、IP数据报路由过程五、路由聚合 一、概述 网际协议 IP 大致分为三大作用模块&#xff0c; ①IP寻址、 ②路由&#xff08;最终节点为止的转发&#xff09; 、③IP分包与组包。前面两篇文章讨论…

dpdk ip分片报文重组处理

dpdk ip报文重组及分片API及处理逻辑介绍 DPDK的分片和重组实现零拷贝&#xff0c;详细介绍可以参阅DPDK分片与重组用户手则 相关数据结构 /** Fragmented packet to reassemble.* First two entries in the frags[] array are for the last and first fragments.*/ struct …

【测试平台开发】

【测试平台开发】 一、 后端开发 1、常见的技术架构与组件 语言&#xff1a; 项目注重高并发&#xff1a;选用go 注重区块链&#xff1a;选用go、rust(主打高性能) 大型浏览网站&#xff08;如电商&#xff09;&#xff1a;Java 技术架构与组件&#xff1a; 前端技术架构&a…

多元回归预测 | Matlab白鲸算法(BWO)优化BP神经网络回归预测,BWO-BP回归预测,多变量输入模型

文章目录 效果一览文章概述部分源码参考资料效果一览 文章概述 多元回归预测 | Matlab白鲸算法(BWO)优化BP神经网络回归预测,BWO-BP回归预测,多变量输入模型 评价指标包括:MAE、RMSE和R2等,代码质量极高,方便学习和替换数据。要求2018版本及以上。 部分源码 %--------------…

供收藏:国内各种免费可用ChatGPT实测(兼验伪) 版本不断更新补充 更新日期:2023/05/28

文章目录 供收藏&#xff1a;国内各种免费可用ChatGPT实测(兼验伪) 版本不断更新补充 更新日期&#xff1a;2023/05/28国内大厂的人工智能语言模型国内可访问的ChatGPT资源&#xff08;创业公司&#xff09;ZelinAI&#xff08;国内可直接访问的ChatGPT&#xff09;注册邀请码网…

2023全国大学生信息安全竞赛(ciscn)初赛题解

战队信息 安全知识 甚至不用看视频&#xff0c;百度就有答案。除了那个最新的美国时政&#xff0c;其它的ChatGPT就能回答。 Misc 签到卡 关注公众号&#xff0c;根据提示&#xff0c;直接print(open(‘/flag’).read())&#xff1a; 国粹 脑洞题&#xff0c;给的题目原图…