【STL】priority_queue 基础,应用与操作
c在C++的标准模板库(STL)中,priority_queue 是一个基于堆的容器适配器,用于实现优先级队列。它本质上是一个最大堆(Max-Heap),即每次取出元素时,始终取出优先级最高的元素。本文将详细讲解priority_queue的基础操作、特性及使用注意事项。
1. priority_queue的基本概念
priority_queue 是一个容器适配器,通常底层使用 vector 和堆(默认是最大堆)来实现。队列中元素按照优先级排序,默认情况下,优先级最高的元素会被优先弹出。这意味着,容器中第一个元素始终是值最大的。
1.1 头文件
要使用 priority_queue,必须包含头文件:
#include <queue>
1.2 基本定义
std::priority_queue<int> pq; // 定义一个存储 int 类型的优先级队列(默认最大堆)
1.3 底层容器选择
priority_queue 可以选择不同的底层容器,常用的包括 vector 和 deque,默认情况下是使用 vector。
2. priority_queue 的基本操作
2.1 push() 插入元素
使用 push() 向队列中插入新元素。插入时,元素会根据优先级被放置到合适的位置。
pq.push(5); // 插入元素 5
pq.push(10); // 插入元素 10
pq.push(3); // 插入元素 3
在插入后,priority_queue 会自动调整,使得最大元素始终位于队列顶端。
2.2 top() 获取最大元素
使用 top()
来访问队列中优先级最高的元素(即最大元素)。这个操作不会移除元素,只是返回它的值。
std::cout << pq.top(); // 输出 10
2.3 pop() 移除最大元素
使用 pop() 来移除队列中优先级最高的元素。请注意,这个操作并不返回被移除的元素,仅仅是将其从队列中删除。
pq.pop(); // 移除优先级最高的元素(10)
2.4 empty() 检查队列是否为空
使用 empty() 可以检查优先级队列是否为空,返回一个布尔值。
if (pq.empty())
{std::cout << "Queue is empty." << std::endl;
}
2.5 size() 返回队列的元素个数
使用 size() 可以返回当前队列中元素的个数。
std::cout << pq.size(); // 输出当前队列中元素的个数
3. 自定义比较函数(最小堆)
默认情况下,priority_queue 是一个最大堆,但可以通过自定义比较器将其变为最小堆。通过指定比较函数,可以改变元素的排列顺序。
3.1 使用 greater 实现最小堆
可以使用 std::greater 来使得 priority_queue 变为最小堆,即优先级最低的元素会优先弹出。
#include <functional> // 引入 less 和 greaterstd::priority_queue<int, std::vector<int>, std::greater<int>> minHeap;
4. priority_queue 特性与注意事项
4.1 底层实现机制
priority_queue 的底层实现依赖于堆排序算法,因此其时间复杂度如下:
- 插入操作 push():O(log n)
- 获取最大元素 top():O(1)
- 删除最大元素 pop():O(log n)
4.2 避免直接遍历
priority_queue 并不提供直接遍历所有元素的方法,原因是它的结构是基于堆的,内部顺序并不保证元素是按优先级依次排列的。因此,如果需要遍历所有元素,通常需要借助额外的容器或将元素逐个弹出。
4.3 谨慎修改元素
priority_queue 并不支持直接修改元素的优先级,一旦插入某个元素,想要调整优先级只能将该元素删除后,重新插入带有新优先级的元素。
5. 使用场景
priority_queue 适用于那些需要频繁取出优先级最高(或最低)元素的场景。常见的应用场景包括:
- 任务调度:根据任务的优先级决定执行顺序。
- 图算法:如Dijkstra算法和Prim算法,利用优先级队列高效处理最短路径或最小生成树。
- 数据流处理:实时处理数据流中前 k 大或前 k 小的元素。
实例如下:
以下是一个简单的例子,演示了如何使用 priority_queue 来处理最大堆和最小堆。
#include <iostream>
#include <queue>
#include <vector>
using namespace std;int main()
{// 默认最大堆priority_queue<int> maxHeap;maxHeap.push(3);maxHeap.push(5);maxHeap.push(1);cout << "Max-Heap: ";while (!maxHeap.empty()){cout << maxHeap.top() << " "; // 输出 5 3 1maxHeap.pop();}cout << endl;// 最小堆priority_queue<int, vector<int>, greater<int>> minHeap;minHeap.push(3);minHeap.push(5);minHeap.push(1);cout << "Min-Heap: ";while (!minHeap.empty()){cout << minHeap.top() << " "; // 输出 1 3 5minHeap.pop();}return 0;
}
7. 总结
priority_queue 是C++ STL中一个强大的容器适配器,用于处理需要频繁访问优先级最高(或最低)元素的场景。 通过了解其基本操作、自定义排序规则以及底层实现机制,开发者可以更加灵活地应用它来解决各类优先级相关的问题。不过,也要注意其一些限制,如无法直接遍历和修改元素优先级。
相关文章:

【STL】priority_queue 基础,应用与操作
c在C的标准模板库(STL)中,priority_queue 是一个基于堆的容器适配器,用于实现优先级队列。它本质上是一个最大堆(Max-Heap),即每次取出元素时,始终取出优先级最高的元素。本文将详细…...

tasklist命令的应用实例
tasklist命令的应用实例 引言 在系统管理和故障排查过程中,了解当前正在运行的进程信息是至关重要的。Windows操作系统提供了一个强大的命令行工具——tasklist,它可以帮助用户查看当前系统中所有正在运行的进程及其相关信息。掌握这个命令的使用&…...

基于协同过滤算法+PHP的新闻推荐系统
作者:计算机学姐 开发技术:SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等,“文末源码”。 专栏推荐:前后端分离项目源码、SpringBoot项目源码、SSM项目源码 系统展示 【2025最新】基于协同过滤算法PHPMySQL的新…...

196页满分PPT | 集团流程优化及IT规划项目案例
细阐述了XX集团信息化建设的总体目标、指导原则、信息架构规划、应用系统架构规划、IT基础设施架构规划以及IT管控模式设计。文档内容涵盖了从现状分析到未来三年信息化建设目标的明确,以及如何通过IT系统支持集团的战略升级。 背景痛点 总体信息架构规划 总体信息架…...

Android 使用高德地图实现道格拉斯 - 普克算法
道格拉斯 - 普克算法(Douglas-Peucker algorithm)是一种用于曲线简化的算法。 一、算法的作用 该算法的主要目的是在保持曲线形状特征的前提下,通过减少数据点的数量来简化曲线。这在地图绘制、图形处理、地理信息系统等领域有广泛的应用。例…...

OpenAI GPT o1技术报告阅读(2)- 关于模型安全性的测试案例
✨报告阅读:使用大模型来学习推理(Reason) 首先是原文链接:https://openai.com/index/learning-to-reason-with-llms/ 接下来我们看一个简单的关于模型安全性的测试,当模型被问到一个有风险的话题时,会如何思考并回答用户呢&…...

Stream流的思想和获取Stream流
首先介绍流的概念: 流可以理解为一条流水线,在这条流水线中有许多操作,比如筛选所需要的数据,输出打印等, 经过这条流水线,可以获取到自己所需要的数据: -->所以: Stream流的作…...

go语言中的切片详解
1.概念 在Go语言中,切片(Slice)是一种基于数组的更高级的数据结构,它提供了一种灵活、动态的方式来处理序列数据。切片在Go中非常常用,因为它们可以动态地增长和缩小,这使得它们比固定大小的数组更加灵活。…...

ElK 8 收集 Nginx 日志
1. 说明 elk 版本:8.15.0 2. 启个 nginx 有 nginx 可以直接使用。我这里是在之前环境下 docker-compose.yml 中启动了个 nginx: nginx:restart: alwaysimage: nginx:1.26.1ports:- "80:80"- "443:443"volumes:#- ./nginx/html:/…...

Xv6驱动(四):CLINT
阅读材料 Xv6代码:memlayout.h、start.c、kernelvec.S教材5.4节 CLINT内存映射 实际上,CLINT还包括若干个MSIP寄存器,用来触发软件中断,但是在Xv6中不考虑软件中断,因此这些寄存器也不用考虑 // core local interr…...

【LInux】HTTPS是如何实现安全传输的
1. 客户端发起HTTPS连接请求 当浏览器请求一个HTTPS网址时,客户端(例如浏览器)会向服务器发起一个HTTPS请求。 2. 服务器返回数字证书 服务器收到请求后,会向客户端发送包含公钥的数字证书。数字证书由**权威认证机构ÿ…...

英飞凌PSoC4000T的GPIO中断示例工程
关于PSoC4000T的初步介绍见:英飞凌MCU第五代高性能CAPSENSE技术PSoC4000T_psoc 4000t-CSDN博客 下面这个工程,在modustoolbox中可编译、下载到开发板、debug调试。 编译时会用到mtb_shared这个库: 已经pdl这个periperal driver library库:...

物联网(IoT)中基于深度学习的入侵检测系统的综合综述
这篇论文是一篇全面的综述,标题为“A comprehensive survey on deep learning-based intrusion detection systems in Internet of Things (IoT)”,作者是Qasem Abu Al-Haija和Ayat Droos。论文主要探讨了在物联网(IoT)环境中基于深度学习的入侵检测系统…...

《成都体育学院学报》
投稿指南 成都体育学院学报属于体育类型期刊,由成都体育学院主办,国内统一刊号:51-1097/G8,国际标准刊号:1001-9154,双月,面向国内外公开发行。 一、来稿必须是作者独立取得的原创性学术研究成…...

Flask-JWT-Extended登录验证, 不用自定义
"""安装:pip install Flask-JWT-Extended创建对象 初始化与app绑定jwt JWTManager(app) # 初始化JWTManager设置 Cookie 的选项:除了设置 cookie 的名称和值之外,你还可以指定其他的选项,例如:过期时间 (max_age)࿱…...

rpm 与 yum
11 rpm -qa | grep openssh rpm与 yum CentOS仅删除软件包本身而不删除依赖 https://blog.csdn.net/kangshuaibi/article/details/125472204...

几种修改docker默认存储位置的方法
需求 docker容器存放目录磁盘空间满了,需要转移数据,修改Docker默认存储位置 解决方法 方法1:迁移到新目录 停止docker服务。 1systemctl stop docker; //每个liunx版本的命令不一样。创建新的docker目录,执行命令df…...

istio中如何使用serviceentry引入外部服务
假设需要引入一个外部服务,外部服务ip为10.10.102.90,端口为32033. 引入到istio中后,我想通过域名gindemo.test.ch:9090来访问这个服务。 serviceentry yaml内容如下: apiVersion: networking.istio.io/v1beta1 kind: ServiceEn…...

模仿抖音用户ID加密ID的算法MB4E,提高自己平台ID安全性
先看抖音的格式 对ID加密的格式 MB4EENgLILJPeQKhJht-rjcc6y0ECMk_RGTceg6JBAA 需求是 同一个ID 比如 413884936367560 每次获取得到的加密ID都是不同的,最终解密的ID都是413884936367560 注意这是一个加密后可解密原文的方式,不是单向加密 那么如下进行…...

solidwork镜像实体
效果如下: 可以看到这两条线是对称的。 第一步,点击这条要镜像的边,接着点击镜像实体。 然后选择镜像轴,即可...

第6天:趋势轮动策略开发(年化18.8%,大小盘轮动加择时)
原创内容第655篇,专注量化投资、个人成长与财富自由。 轮动策略是一种投资策略,它涉及在不同的资产类别、行业或市场之间进行切换,以捕捉市场机会并优化投资组合的表现。 这种策略的核心在于识别并利用不同资产或市场的相对强弱,…...

米客方德SD NAND 掉电测试
SD NAND 异常上下电测试的作用 SD NAND 异常上下电测试是一项关键的测试步骤,对确保SD NAND在不同电源条件下的稳定性和可靠性至关重要。 通过模拟正常和异常电源情况,测试可以验证设备的电源管理功能、检测潜在错误和异常行为,并评估设备在…...

深入探索Android开发之Kotlin核心技术学习大全
Android作为全球最流行的移动操作系统之一,其开发技能的需求日益增长。本文将为您介绍一套专为Android开发者设计的Kotlin核心技术学习资料,包括详细的学习大纲、PDF文档、源代码以及配套视频教程,帮助您从Kotlin基础到高级特性,再…...

langchain报错记录(js)
文章目录 [ERR_PACKAGE_PATH_NOT_EXPORTED]报错:报错语句:思路:解决方法: [ERR_PACKAGE_PATH_NOT_EXPORTED] 报错: Error [ERR_PACKAGE_PATH_NOT_EXPORTED]: Package subpath ‘./dist/prompts/’ is not defined by…...

VSCode调试Unity准备工作
一.Unity设置VSCode为默认编辑器 Unity编辑器中Edit-Preferences-External Tools中选择VSCode 二.VSCode安装Unity插件 三.Unity的Visual Studio Editor升至最新 Window->Package Manager->Visual Studio Editor 四.下载配置.Net 8.0 安装之前VSCode会提示你下载.Net …...

缓存穿透 问题(缓存空对象)
文章目录 1、缓存穿透2、缓存空对象3、AlbumInfoApiController --》getAlbumInfo()4、AlbumInfoServiceImpl --》getAlbumInfo()5、RedisConstant6、请求缓存不存在的数据 1、缓存穿透 2、缓存空对象 3、AlbumInfoApiController --》getAlbumInfo() GetMapping("getAlbumI…...

Vue3:mitt实现组件通信
目录 一.性质 1.轻量级 2.单例 3.异步 4.事件绑定与解绑 二.作用 1.组件间通信 2.解耦 3.状态管理 4.事件的集中处理 三.使用 1.安装mitt 2.引入mitt;调用mitt;暴露mitt 3.组件1 4.组件2 四.代码 1.组件1 2.组件2 五.效果 一.性质 1…...

一个有个性的使用工具thefuck@Ubuntu
这个工具名字可能有些粗鄙,不过真的有让人眼前一亮的功能。 当用户输入错误的命令时,TheFuck会根据上下文自动推测并给出正确的命令建议。 安装 apt update apt search thefuck apt install thefuck 使用 在错误命令下面直接输入thefuck即可。 不过…...

【PyQt5】PyQt5桌面APP开发学习
跟我学习PyQt5之每天一更 1、兴趣是最好的坚持2、object基类3、QWidget子类 等我不更新了,就说明我学习完成了,有想学而又不会的可以催更留言! 1、兴趣是最好的坚持 看视频看书不如先来一个游戏玩一玩,学习由对他有兴趣开始 2024…...

JdbcTemplate常用方法一览AG网页参数绑定与数据寻址实操
JdbcTemplate是Spring框架中的一个重要组件,主要用于简化JDBC数据库操作。它提供了许多常用的方法,如查询、插入、更新、删除等。本文将介绍JdbcTemplate的常用方法及其使用方式,以及参数绑定和删除数据的方法。 一、JdbcTemplate常用方法 查…...