当前位置: 首页 > news >正文

19.优先级队列容器priority_queue

目录

一、什么是优先级队列

二、priority_queue容器介绍

priority_queue的接口

1. 构造函数

2. 核心操作接口

3. 注意事项


一、什么是优先级队列

首先优先级队列是一种抽象数据类型,它与普通队列“ 先进先出(FIFO)” 的规则不同,它是按照元素的优先级进行操作的:每次取出的元素都是当前队列中优先级最高/最低的,(相当于是一个有序的数组,并且进行插入删除等操作后依旧有序)

优先级队列底层可以通过多种数据结构实现,不同实现的效率不同。最常用的是通过堆来实现。C++标准库中的实现的优先级队列容器priority_queue,就是通过最大堆实现的(即每次取出的元素是当前队列中最大的)它的核心特性是:无论插入顺序如何,每次弹出的都是优先级最高(默认是最大)的元素。

二、priority_queue容器介绍

priority是一种容器适配器,他的底层容器必须要是支持 push_backpop_backfront 等操作的随机访问容器。一般是vector容器

导入<queue>头文件,即可使用priority_queue容器

priority_queue的接口

1. 构造函数

初始化时一般不需要参数,重点在模板的使用,第一个模板参数需要指定容器存储的数据类型,如int类型。默认用最大堆实现的,如果想要最小堆,那可以使用greater比较器

示例代码:

// 1. 默认:存储 int,底层用 vector,最大堆(less<int>)
priority_queue<int> pq;// 2. 最小堆(需指定 greater<int> 比较器)
priority_queue<int, vector<int>, greater<int>> min_pq;

2. 核心操作接口

操作功能描述时间复杂度
push(val)插入元素 val 到队列,并调整堆结构O(log n)
pop()移除队列中优先级最高的元素(队首)O(log n)
top()返回队列中优先级最高的元素(不删除)O(1)
empty()判断队列是否为空O(1)
size()返回队列中元素的个数O(1)

示例代码:

#include <iostream>
#include <queue>
using namespace std;int main() {// 定义一个最大堆(默认)priority_queue<int> pq;// 测试 empty() 和 size()(初始状态)cout << "初始状态:" << endl;cout << "是否为空?" << (pq.empty() ? "是" : "否") << endl;cout << "当前元素数量:" << pq.size() << endl << endl;// 测试 push() 插入元素cout << "执行 push(3), push(1), push(5), push(2) 后:" << endl;pq.push(3);pq.push(1);pq.push(5);pq.push(2);// 再次测试 empty() 和 size()cout << "是否为空?" << (pq.empty() ? "是" : "否") << endl;cout << "当前元素数量:" << pq.size() << endl;// 测试 top() 查看堆顶元素(最大值)cout << "当前堆顶元素(优先级最高):" << pq.top() << endl << endl;// 测试 pop() 移除堆顶元素,并循环查看剩余元素cout << "依次执行 pop() 并查看堆顶:" << endl;while (!pq.empty()) {cout << "弹出前堆顶:" << pq.top() << ",当前数量:" << pq.size() << endl;pq.pop();}// 最后测试 empty() 和 size()(空状态)cout << endl << "所有元素弹出后:" << endl;cout << "是否为空?" << (pq.empty() ? "是" : "否") << endl;cout << "当前元素数量:" << pq.size() << endl;return 0;
}

3. 注意事项

  • priority_queue 不提供迭代器,无法遍历所有元素,只能通过 top() 访问堆顶元素
  • 当多个元素优先级相同时,弹出顺序不确定(不保证插入顺序)
  • 插入和弹出操作均为 O(log n),适合需要频繁获取最值的场景

以上便是本文的全部内容了,如果觉得有帮助的话可以点赞收藏加关注支持一下!

http://www.dtcms.com/a/614238.html

相关文章:

  • 做盗版视频网站成本多少钱低调与华丽wordpress下载
  • JAVA EE初阶 6: 网络编程套接字
  • 旅行网站建设方案策划书wordpress一键优化
  • 自己动手写深度学习框架(优化深度学习框架)
  • C语言编译过程五个步骤 | 深入解析编译过程中的关键环节
  • MATLAB基于云-灰关联分析的教学评价研究
  • 网站由谁备案hyip网站开发
  • 太阳能建设网站y2学年做的租房网站
  • 商场BA楼宇自控系统项目案例
  • React Router
  • 自建网站系统兰州最近事件
  • 【计算机算法设计与分析】动态规划与贪心算法教程:从矩阵连乘到资源优化
  • 智能化时代的SEO关键词优化新策略与实践探索
  • 免费外贸建站平台访问网页的流程
  • 宁夏水利厅建设处网站阳信网站建设
  • 传导案例:某3KW 开关电源整改案例分享
  • 针对特定业务场景(如金融交易、日志处理)选择最优的MPSC实现
  • 练习python题目小记(五)
  • 怎么建立网站 个人云速网站建设公司
  • 怎么用自己电脑做网站社区教育网站建设方案
  • 卫星互联网:弥合数字鸿沟的“天基网络“
  • 选择排序的原理及示例
  • 【开题答辩全过程】以 房产网站为例,包含答辩的问题和答案
  • spring Profile
  • 当AI不再等待指令:智能体工作流如何重构商业逻辑
  • 手机网站建设哪儿好wordpress怎么固定导航栏
  • 基于大数据Python豆瓣电影可视化系统 电影数据爬虫 数据清洗+数据可视化 Flask+requests (MySQL+Echarts 源码+文档)✅
  • 自己建设网站怎么挣钱微信小程序推广软件
  • 专门做继电器的网站泉州做网站优化哪家好
  • 信息安全工程师软考精通:第六章物理与环境安全深度解析