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

【C++】priority_queue的底层封装和实现

目录

  • 前言
  • 基本结构
  • 如何设置默认大小堆
  • 底层实现
    • 仿函数的使用
    • 向上调整算法
    • 向下调整算法
    • 其他接口
  • end

前言

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

注意: 默认情况下priority_queue是大堆。

基本结构

关于优先级队列实际上就是一个堆,堆分为大根堆和小根堆
在这里插入图片描述

  • 这里列举大根堆

关于堆这个数据结构我在【手撕数据结构】二叉树和堆这篇文章里已经详细讲解过,如果还不了解的可以去看看这篇文章

如何设置默认大小堆

这里我们提出一个叫仿函数的概念:
看看库里面的priority_queue

在这里插入图片描述

  • 其实仿函数就是一个类,和容器适配器差不多,仿函数仿在哪里,我们知道函数调用都是通过()来标记这是一个函数,所以这个类里面就重载了()运算符
    在这里插入图片描述

注意:
1.提供Greater(大于)是小根堆
2.提供Less(小于) 是大根堆

底层实现

仿函数的使用

	template<class T, class Contain = vector<T>, class Compare = Less<T>>class Priority_queue{Compare com; 
  • 定义一个仿函数对象com
if (child + 1 < _con.size() && com(_con[child], _con[child + 1]))- 这里就是使用对象的运算符重载()达到大小相比

向上调整算法

  • 这个原理我也在以前的文章中讲过,这里就不再详细讲解了,请往上面的链接去看
void AdjustUp(int child)
{int parent = (child - 1) / 2;while (child > 0)	//测试一下{if (com(_con[parent], _con[child])){swap(_con[parent], _con[child]);child = parent;parent = (child - 1) / 2;}else{break;}}

向下调整算法

	void AdjustDown(int parent){int child = 2 * parent + 1;while (child < _con.size()){if (child + 1 < _con.size() && com(_con[child], _con[child + 1])){child++;}if (com(_con[parent], _con[child])){swap(_con[parent], _con[child]);parent = child;child = 2 * parent + 1;}else{break;}}}

其他接口

		void push(const T& x){_con.push_back(x);AdjustUp(_con.size() - 1);}void pop(){swap(_con[0], _con[_con.size() - 1]);_con.pop_back();AdjustDown(0);}const T& top(){return _con[0];}bool empty(){return _con.empty();}int size(){return _con.size();}
  • 根据复用vector这个容器适配器接口就行, pop是堆的删除所以是删除堆顶,然后重新调整堆的特征结构
  • 插入从最后插入,也是要调整结构。
  • 具体原理图解看以前的文章,前面我已经给了链接。

end

感谢大家的阅读,希望对你们有帮助

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

相关文章:

  • 线性代数 | 知识点整理 Ref 2
  • 考研单词笔记 2025.04.17
  • 从“链主”到“全链”:供应链数字化转型的底层逻辑
  • 青少年编程与数学 02-016 Python数据结构与算法 25课题、量子算法
  • 【C/C++】深入理解指针(二)
  • 考道路运输安全员证应具备哪些经验?
  • IDEA使用jclasslib Bytecode Viewer查看jvm字节码
  • 机器学习有多少种算法?当下入门需要全部学习吗?
  • 设计模式每日硬核训练 Day 14:组合模式(Composite Pattern)完整讲解与实战应用
  • ECMAScript 尾递归优化
  • 数据库相关概念,关系型数据库的核心要素,MySQL(特点,安装,环境变量配置,启动,停止,客户端连接),数据模型
  • ffmpeg 添加 nvenc支持
  • Ubuntu 安装WPS Office
  • Linux: 生产者消费者模型
  • Windows 环境下 Apache 配置 WebSocket 支持
  • MySQL之SQL优化
  • 在RAG大模型中token怎么作为有效的数据,体现大模型能力的
  • uniapp APP端 DOM生成图片保存到相册
  • Three.js + React 实战系列 : 从零搭建 3D 个人主页
  • RT-Thread学习笔记(一)
  • java 设计模式之单例模式
  • 关于 雷达(Radar) 的详细解析,涵盖其定义、工作原理、分类、关键技术、应用场景、挑战及未来趋势,结合实例帮助理解其核心概念
  • 【模型常见评价指标(分类)】
  • 从 ComponentActivity 看 Android Activity 的演变与 Jetpack 架构融合
  • 驱动开发硬核特训 · Day 14:深入理解 Power 管理驱动架构与实战应用
  • SQL Server 存储过程
  • webgl入门实例-08索引缓冲区的基本概念
  • 02、GPIO外设(一):基础知识
  • 3D人脸扫描技术如何让真人“进入“虚拟,虚拟数字人反向“激活“现实?
  • 机器学习在催化剂设计中的应用理论加实操