C++:优先级队列
目录
1. 概念
2. 特征
3. 优先级队列的使用
1. 概念
优先级队列虽然名字有队列二字,但根据队列特性来说优先级队列不满足先进先出这个特征,优先级队列的底层是用堆来实现的。
优先级队列是一种容器适配器,就是将特定容器类封装作为其底层容器类。
2. 特征
这是优先级队列的模板参数,第一个是具体元素的类型,第二个是实现底层连接的容器,默认是vector,第三个则是改变优先级的参数了,这里默认是仿函数less。对于此处仿函数的使用可以参考下面的文章 :C++:仿函数-CSDN博客
这里特定容器的选择需满足以下条件:
empty():检测容器是否为空size():返回容器中有效元素个数front():返回容器中第一个元素的引用push_back():在容器尾部插入元素pop_back():删除容器尾部元素
以及改容器可以通过随机访问迭代器访问,因为建堆是需要通过子节点找到父节点或通过父节点找子节点。
综合以上条件,有vector和deque满足。
注意:priority_queue包含在queue的头文件中。
3. 优先级队列的使用
优先级队列默认使用vector作为其底层存储数据的容器,在vector上又使用了堆算法将vector中元素构造成 堆的结构,因此priority_queue就是堆,所有需要用到堆的位置,都可以考虑使用priority_queue。
常用参数 | 作用 |
empty() | 判断是否为空 |
size() | 优先级队列的长度 |
push() | 向队尾插入数据 |
pop() | 删除顶部数据 |
swap() | 交换两个数据 |
top() | 返回优先级队列中最大(最小元素),即堆顶元素 |
下面的代码中当我们只写一个参数时,后两个模板参数默认为vector和less(大堆)
int main()
{int num[] = { 3,5,7,1,9,4 };priority_queue<int> pq(num, num + sizeof(num) / sizeof(int));while (!pq.empty()){cout << pq.top() << " ";pq.pop();}cout << endl;
}
我们每次删除或插入数据后,都会将优先级队列重新建堆,保证优先级最高的元素始终在顶部。
注意:如果priority_queue中放的是自定义类型,那需要我们先写出这个自定义类型的 < 和 > 的重载函数。
如果优先级队列中放的是一个开辟空间的节点,那么就必须自己写一个仿函数
下面代码中用的是库函数中的仿函数,那么此时因为仿函数中比较的的是指针,也就是空间的大小,而每次开辟的空间大小都是随机的,所以我们每次运行的结果都是不同的;
这里Less是模拟库函数中的less
template<class T>
class Less
{
public:bool operator()(const T& a, const T& b){return a < b;}
};
int main()
{priority_queue<Date*, vector<Date*>, Less<Date*> > pq;pq.push(new Date(2004, 7, 10));pq.push(new Date(2004, 6, 10));pq.push(new Date(2004, 8, 10));while (!pq.empty()){cout << *pq.top() << " ";pq.pop();}cout << endl;
}
解决的办法就是我们手动写一个专属于Date类的仿函数LessDate,返回解引用的比较,此时比较的就是实际的数了。
class LessDate
{
public:bool operator()(const Date* a, const Date* b){return *a < *b;}
};
int main()
{priority_queue<Date*, vector<Date*>,LessDate > pq;pq.push(new Date(2004, 7, 10));pq.push(new Date(2004, 6, 10));pq.push(new Date(2004, 8, 10));while (!pq.empty()){cout << *pq.top() << " ";pq.pop();}cout << endl;
}
相关文章:

C++:优先级队列
目录 1. 概念 2. 特征 3. 优先级队列的使用 1. 概念 优先级队列虽然名字有队列二字,但根据队列特性来说优先级队列不满足先进先出这个特征,优先级队列的底层是用堆来实现的。 优先级队列是一种容器适配器,就是将特定容器类封装作为其底层…...

睡眠分期 html
截图 代码 <!DOCTYPE html> <html lang"zh-CN"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>睡眠图表</title><script src…...
Java求职者面试:Spring、Spring Boot、Spring MVC与MyBatis技术深度解析
Java求职者面试:Spring、Spring Boot、Spring MVC与MyBatis技术深度解析 一、第一轮提问(基础概念问题) 1. 请解释什么是Spring框架?它的核心功能是什么? JY:Spring是一个开源的Java/Java EE企业级应用开…...

Github 2025-05-29 Go开源项目日报Top9
根据Github Trendings的统计,今日(2025-05-29统计)共有9个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量Go项目9Assembly项目1Ollama: 本地大型语言模型设置与运行 创建周期:248 天开发语言:Go协议类型:MIT LicenseStar数量:42421 个Fork数量:27…...
前端项目种对某个文件夹进行大小写更改,git识别不到差异导致无变化
问题背景 开发过程中可能遇到一个文件名要更改大小写,但是更改后之后本地会有变化,但是git识别不到差异化,正常去更改一个文件名称git差异化会出现删除了原有文件,新增了一个新文件,但是更改大小写则不会 如何解决 在终端中输入git config…...

AWS VPC 网络详解:理解云上专属内网的关键要素
全面解读 AWS VPC、子网、安全组、路由与 NAT 网关的实际应用 在使用 AWS 云服务的过程中,许多用户最先接触的是 EC2(云服务器)。但你是否曾遇到过这样的情况:实例启动正常,却无法访问公网?或者数据库无法…...

Ubuntu24.04.2 + kubectl1.33.1 + containerdv1.7.27 + calicov3.30.0
Ubuntu24.04.2 kubectl1.33.1 containerdv1.7.27 calicov3.30.0 安装Ubuntu24.04.2 kubectl1.33.1 containerdv1.7.27 calicov3.30.0 1.安装Ubuntu24.04.2,设置阿里云镜像地址 $ sudo vim /etc/apt/sources.list.d/ubuntu.sources URIs: https://mirrors.aliy…...

循环神经网络(RNN)全面教程:从原理到实践
循环神经网络(RNN)全面教程:从原理到实践 引言 循环神经网络(Recurrent Neural Network, RNN)是处理序列数据的经典神经网络架构,在自然语言处理、语音识别、时间序列预测等领域有着广泛应用。本文将系统介绍RNN的核心概念、常见变体、实现方法以及实际…...

uniapp 键盘顶起页面问题
关于uniapp中键盘顶起页面的问题。这是一个在移动应用开发中常见的问题,特别是当输入框位于页面底部时,键盘弹出会顶起整个页面,导致页面布局错乱。 pages.json 文件内,在需要处理软键盘的页面添加 softinputMode 配置࿱…...
利用TOA与最小二乘法直接求解
为了利用到达时间(TOA)和最小二乘法直接求解,我们首先需要理解TOA定位的基本原理和最小二乘法的应用。 步骤1: 理解TOA定位原理 到达时间(TOA)定位是通过测量信号从发射源到达接收器的时间来确定位置的一种方法。假设…...
SpringBoot系列之RabbitMQ 实现订单超时未支付自动关闭功能
系列博客专栏: JVM系列博客专栏SpringBoot系列博客 RabbitMQ 实现订单超时自动关闭功能:从原理到实践的全流程解析 一、业务场景与技术选型 在电商系统中,订单超时未支付自动关闭功能是保障库存准确性、提升用户体验的核心机制。传统定时任…...

【C++高级主题】命令空间(五):类、命名空间和作用域
目录 一、实参相关的查找(ADL):函数调用的 “智能搜索” 1.1 ADL 的核心规则 1.2 ADL 的触发条件 1.3 ADL 的典型应用场景 1.4 ADL 的潜在风险与规避 二、隐式友元声明:类与命名空间的 “私密通道” 2.1 友元声明的基本规则…...
ArcGIS Pro 3.4 二次开发 - 地图创作 1
环境:ArcGIS Pro SDK 3.4 + .NET 8 文章目录 ArcGIS Pro 3.4 二次开发 - 地图创作 11 样式管理1.1 如何通过名称获取项目中的样式1.2 如何创建新样式1.3 如何向项目添加样式1.4 如何从项目中移除样式1.5 如何向样式添加样式项1.6 如何从样式中移除样式项1.7 如何判断样式是否可…...
2.1HarmonyOS NEXT开发工具链进阶:DevEco Studio深度实践
HarmonyOS NEXT开发工具链进阶:DevEco Studio深度实践 在HarmonyOS NEXT全栈自研的技术体系下,DevEco Studio作为一站式开发平台,通过深度整合分布式开发能力,为开发者提供了从代码编写到多端部署的全流程支持。本章节将围绕多设…...
MyBatis常用注解全解析:从基础CRUD到高级映射
MyBatis常用注解全解析:从基础CRUD到高级映射 本文全面解析MyBatis核心注解体系,涵盖基础操作、动态SQL、关系映射等高级特性,助你彻底掌握MyBatis注解开发精髓 一、MyBatis注解概述 1.1 注解 vs XML配置 MyBatis同时支持XML配置和注解两种…...

国标GB28181设备管理软件EasyGBS视频平台筑牢文物保护安全防线创新方案
一、方案背景 文物作为人类文明的珍贵载体,具有不可再生性。当前,盗窃破坏、游客不文明行为及自然侵蚀威胁文物安全,传统保护手段存在响应滞后、覆盖不全等局限。随着5G与信息技术发展,基于GB28181协议的EasyGBS视频云平台&…...
十二、【核心功能篇】测试用例列表与搜索:高效展示和查找海量用例
【核心功能篇】测试用例列表与搜索:高效展示和查找海量用例 前言准备工作第一步:更新 API 服务以支持分页和更完善的搜索第二步:创建测试用例列表页面组件 (`src/views/testcase/TestCaseListView.vue`)第三步:测试列表、搜索、筛选和分页总结前言 当测试用例数量逐渐增多…...

Baklib内容中台AI重构智能服务
AI驱动智能服务进化 在智能服务领域,Baklib内容中台通过自然语言处理技术与深度学习框架的深度融合,构建出具备意图理解能力的知识中枢。系统不仅能够快速解析用户输入的显性需求,更通过上下文关联分析算法识别会话场景中的隐性诉求…...

数据库包括哪些?关系型数据库是什么意思?
目录 一、数据库包括哪些 (一)关系型数据库 (二)非关系型数据库 (三)分布式数据库 (四)内存数据库 二、关系型数据库是什么 (一)关系模型的基本概念 …...

Python爬虫监控程序设计思路
最近因为爬虫程序太多,想要为Python爬虫设计一个监控程序,主要功能包括一下几种: 1、监控爬虫的运行状态(是否在运行、运行时间等) 2、监控爬虫的性能(如请求频率、响应时间、错误率等) 3、资…...
Edge浏览器怎样开启兼容模式
允许站点在 IE 模式下重新加载: 打开 Edge 浏览器,点击右上角的三个点图标,选择 “设置”(或者按下 “Alt F” 组合键后再点击 “设置”)。在设置页面中,切换到左侧的 “默认浏览器” 选项卡。在 “Intern…...

【HarmonyOS 5】Laya游戏如何鸿蒙构建发布详解
【HarmonyOS 5】Laya游戏如何鸿蒙构建发布详解 一、前言 LayaAir引擎是国内最强大的全平台引擎之一,当年H5小游戏火的时候,腾讯入股了腊鸭。我还在游戏公司的时候,17年曾经开发使用腊鸭的H5小游戏,很怀念当年和腊鸭同事一起解决…...
C++ TCP传输心跳信息
在C++ TCP程序中实现心跳机制是保持连接活跃、检测连接状态的重要手段。以下是几种常见的心跳实现方式: 1. 应用层心跳(推荐) 基本心跳实现 #include <iostream> #include <thread> #include <chrono>...
Elasticsearch | 如何将修改已有的索引字段类型并迁移数据
CodingTechWork 引言 在 Elasticsearch 中,一旦索引的字段类型被定义,就无法直接修改已有字段的类型。例如,如果你已经将 timestamp 字段的类型设置为 TEXT,并希望将其更改为 DATE 类型,这将需要一些额外的步骤。在这…...
c++之STL容器的学习(上)
一、泛型编程(函数模板和类模板) 这部分围绕泛型编程技术展开,C中的泛型编程主要是通过函数模板和类模板实现的,主要会介绍标准模板库STL的知识点。1.关于模板的理解 模板就是建立一种通用的模式,从而提高复用性。在生…...
Linux 环境下高效视频切帧的实用指南
Linux 环境下高效视频切帧的实用指南 在视频处理领域,切帧是一项基础且常用的操作,它能够将视频按照指定的规则提取出单帧图像,广泛应用于视频分析、视频缩略图生成、视频内容预览等场景。在 Linux 系统中,我们可以借助强大的开源…...

【鱼皮-用户中心】笔记
任务:完整了解做项目的思路,接触一些企业及的开发技术 title 企业做项目流程需求分析技术选型 计划一一、前端初始化1. **下载node.js**2. **安装yarn**3. **初始化 Ant Design Pro 脚⼿架(关于更多可进入官网了解)**4. **开启Umi…...
MUX-VLAN基本概述
目录 1)技术背景: 2)基本概念: 3)配置:进vlan视图下键入 1)技术背景: 在企业网络中,各个部门之间网络需要相互独立,通常使用VLAN技术可以实现这一要求。如果企…...
Cursor使用最佳实践总结
#作者:曹付江 文章目录 1、需求文档怎么写2. 项目文件夹选择3.技术栈的选择4.最重要:Cursor中的Rules(规则)5.对话模式与模型选择6. New Chat(新建对话)7.自动化测试8.前后端细调的方法9、完整Cursor项目模…...

交错推理强化学习方法提升医疗大语言模型推理能力的深度分析
核心概念解析 交错推理:灵活多变的思考方式 交错推理(Interleaved Reasoning)是一种在解决复杂问题时,不严格遵循单一、线性推理路径,而是交替、灵活应用多种推理策略的方法。这种思维方式与人类专家在处理复杂医疗问题时的思考模式更为接近,表现为一种动态、适应性强的…...