C++中priority_queue的模拟实现(注释详解)

                首先我们要了解什么是 priority_queue ,priority_queue 优先队列是一种数据结构,它存储了元素以及它们的优先级。在优先队列中,元素按照其优先级的顺序进行移除,优先级较高的元素首先被移除。优先队列通常使用堆数据结构来实现,这样可以实现根据优先级高低高效地插入和移除元素。

                而如何控制优先级比较就可以快速的进行建堆操作,此外,我们还可以使用不同的容器来进行实现 优先级队列。因此,看似简单的 优先级队列,我们通过 模板仿函数 的封装,也能玩出花来。话不多说,上代码。

#include<iostream>
#include<list>
#include<vector>
using namespace std;
namespace test
{template <class T>struct Less// 大堆//com(_con[parent],_con[child]){bool operator()(const T& x, const T& y){return x < y;}};template <class T>struct Greater// 小堆{bool operator()(const T& x, const T& y){return x > y;}};//针对 指针类型 的仿函数template <class T>struct GreaterPtr{bool operator()(const T& p1, const T& p2){return *p1 > *p2;}};//仿函数可以控制比较逻辑,也可以进行多种类型之间的比较//每一次比较够可以通过 给定的 仿函数类型//进行特定的比较//虽然只重载了 () 但是真nb//当然也可以对仿函数进行 特化处理 用来针对特殊参数类型template <class T>struct Greater<T*>{bool operator()(const T* x, const T* y){return *x > *y;}};//priority_queuetemplate<class T, class Container = vector<T>, class Compare = less<T>>// Container 使用 deque 也可以适配//优先级队列class priority_queue//默认是大堆  less{public:void adjust_up(size_t child){Compare com;// less<T>size_t parent = (child - 1) / 2;while (child > 0){//if (_con[child] > _con[parent])// < 大堆 less       > 小堆 greater//if (_con[parent] < _con[child])if (com(_con[parent], _con[child]))//大堆 <{swap(_con[child], _con[parent]);child = parent;parent = (child - 1) / 2;}elsebreak;}}void push(const T& x)//尾部插入,向上调整{_con.push_back(x);adjust_up(_con.size() - 1);//向上调整}void adjust_down(size_t parent){Compare com;// less<T>size_t child = parent * 2 + 1;//左孩子while (child < _con.size()){//if (child + 1 < _con.size() && _con[child + 1] > _con[child])//if (child + 1 < _con.size() && _con[child] < _con[child+1])if (child + 1 < _con.size() && com(_con[child], _con[child + 1])){child++;//右孩子, 大堆,取较大的}//if (_con[child] > _con[parent])//if (_con[parent] < _con[child])if (com(_con[parent], _con[child])){swap(_con[child], _con[parent]);parent = child;child = parent * 2 + 1;}elsebreak;}}void pop()//删除堆顶,将首尾交换{swap(_con[0], _con[_con.size() - 1]);//首尾交换_con.pop_back();adjust_down(0);//向下调整}bool empty(){return _con.empty();}size_t size(){return _con.size();}const T& top(){return _con[0];}private:Container _con;};
}
int main()
{test::priority_queue<int,vector<int>, less<int>> pq;// test::priority_queue<int> pq;  等价与上,采用 缺省模板pq.push(50);pq.push(60);pq.push(20);pq.push(10);pq.push(40);pq.push(30);//建大堆while (!pq.empty()){cout << pq.top() << " ";pq.pop();}return 0;
}

运行结果:

  在priority_queue的模板中:

  template<class T, class Container = vector<T>, class Compare = less<T>>,

我们可以改变其中 默认 Container 的类型选择不同的容器来实现优先级队列,还可以通过 设置默认的 Compare 的仿函数来采用不同的 比较逻辑。可以看到,这个模拟实现的 priority_queue 有很强的自主性,其中仿函数的实现更是点睛之笔,一个简单的结构体就能实现多种类型的比较。

                最近很喜欢苏轼的一首诗《水调歌头·黄州快哉亭赠张偓佺》赠给同学们!!!!!!!!!

        落日绣帘卷,亭下水连空。知君为我新作,窗户湿青红。长记平山堂上,欹枕江南烟雨,杳杳没孤鸿。认得醉翁语,“山色有无中”。 
  一千顷,都镜净,倒碧峰。忽然浪起,掀舞一叶白头翁。堪笑兰台公子,未解庄生天籁,刚道有雌雄。一点浩然气,千里快哉风。

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

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

相关文章

Linux内核编程(六)平台总线plantform驱动模型

本文目录 前述&#xff1a;为什么引入平台总线模型一、知识点1. 什么是平台总线模型2. 平台总线模型使用3. 平台总线是如何工作的4. 平台总线模型的优点 二、平台总线设备层1. 常用API&#xff08;1&#xff09; 注册一个平台设备&#xff08;2&#xff09; 注销一个平台设备&a…

最好用的智能猫砂盆存在吗?自用分享智能猫砂盆测评!

在现代都市的忙碌生活中&#xff0c;作为一名上班族&#xff0c;经常因为需要加班或频繁出差而忙碌得不可开交。急匆匆地出门&#xff0c;却忘了给猫咪及时铲屎。但是大家要知道&#xff0c;不及时清理猫砂盆会让猫咪感到不适&#xff0c;还会引发各种健康问题&#xff0c;如泌…

SolidityFoundry 安全审计测试 Delegatecall漏洞2

名称&#xff1a; Delegatecall漏洞2 https://github.com/XuHugo/solidityproject/tree/master/vulnerable-defi 描述&#xff1a; 我们已经了解了delegatecall 一个基础的漏洞——所有者操纵漏洞&#xff0c;这里就不再重复之前的基础知识了&#xff0c;不了解或者遗忘的可…

HTML入门教程:深度解析HTML,开启你的前端技术之旅

一、引言 HTML&#xff08;HyperText Markup Language&#xff0c;超文本标记语言&#xff09;是前端开发的基础&#xff0c;它负责构建网页的结构和内容。作为前端技术栈的基石&#xff0c;HTML的掌握程度直接影响到网页的开发效率和用户体验。本教程将带你从零开始&#xff…

C语言从头学23——参数的传值与传址引用

在前面学习函数时&#xff0c;曾学习过函数的参数。函数的参数可以是具体的值&#xff0c;也可以是变量。当函数的参数是变量时&#xff0c;就涉及到参数如何传递到函数中。一般有两种方式&#xff1a;传值引用方式、传址引用方式。 一、传值引用&#xff1a;函数的参数以…

微信小程序学习(四):模板语法、数据绑定、数据监听

1、声明和绑定数据 小程序页面中使用的数据均需要在 Page() 方法的 data 对象中进行声明定义在将数据声明好以后&#xff0c;需要在 WXML 中绑定数据&#xff0c;数据绑定最简单的方式是使用 Mustache 语法&#xff08;双大括号&#xff09;将变量包起来。在 {{ }} 内部可以做…

使用vue自定义指令directive写一个div移动指令

使用vue自定义指令directive写一个div移动指令 1、在src/utils目录创建drag.js文件。在注册指令名称时不需要‘v-’&#xff1b; import Vue from vueVue.directive(drag, {bind(el,binding){// 鼠标是否按下let dragging false;// 鼠标距离当前元素的x轴向距离let offsetX …

(新)Spring Security如何实现登录认证(实战篇)

一、回顾认证流程详解 概念速查: Authentication接口: 它的实现类&#xff0c;表示当前访问系统的用户&#xff0c;封装了用户相关信息。 AuthenticationManager接口&#xff1a;定义了认证Authentication的方法 UserDetailsService接口&#xff1a;加载用户特定数据的核心接…

从视频创意到传播策略 | 医药产品TVC新媒体传播方案

作为营销策划人&#xff0c;你一定在寻找能够激发创意灵感、拓展策划视野的实战案例。这份最新传播方案由Unithought精心打造&#xff0c;不仅是一份详尽的策划指南&#xff0c;更是一次深入患者心灵的品牌传播实践。 何策网&#xff0c;每日收录全网方案PPT &#xff01; 方…

Simulink代码生成: 基本数据类型

文章目录 1 引言2 Simulink中的基本数据类型3 数据类型实例3.1 浮点类型3.2 整数类型3.3 布尔类型 3 数据类型使用的注意点3.1 浮点数等于比较3.2 整形数溢出3.3 布尔类型的位域 4 关于定点数的说明5 总结 1 引言 正如C语言中为变量区分了不同的数据类型一样&#xff0c;Simul…

【机器学习】无监督学习:探索数据背后的隐藏模式

在机器学习的广阔领域中&#xff0c;监督学习因其直观的训练方式和广泛的应用场景&#xff0c;往往受到更多的关注。然而&#xff0c;随着数据量和数据类型的不断增长&#xff0c;无监督学习的重要性日益凸显。本文将详细介绍无监督学习的理论基础、常用算法及其在实际中的应用…

Spark日志有哪些?

spark.log&#xff1a;记录作业运行日志&#xff0c;包括Spark框架内部日志和用户通过日志接口输出的日志。 executor 启动结束日志&#xff1a; job&#xff0c;stage&#xff0c;task提交结束日志&#xff1a; pmap.log&#xff1a;周期性地截取Driver或Executor的pmap和…

Java 17的新特性

Java 17引入了多项新特性&#xff0c;以下是一些重要的更新&#xff1a; 增强的伪随机数生成器&#xff08;JEP 356&#xff09; Java 17为伪随机数生成器&#xff08;PRNG&#xff09;提供了新的接口类型和实现&#xff0c;包括可跳转的PRNG和另一类可拆分的PRNG算法&#xf…

公开整理-中国海关进出口增减数据(2008-2024年)

数据来源&#xff1a;东方财富网 时间跨度&#xff1a;2008年至今 数据范围&#xff1a;全国范围 数据指标&#xff1a; 年月 当月出口额-金额 当月出口额-同比增长 当月出口额-环比增长 当月进口额-金额 当月进口额-同比增长 当月进口额-环比增长 累计…

探索RESTful API开发,构建可扩展的Web服务

介绍 当我们浏览网页、使用手机应用或与各种互联网服务交互时&#xff0c;我们经常听到一个术语&#xff1a;“RESTful API”。它听起来很高深&#xff0c;但实际上&#xff0c;它是构建现代网络应用程序所不可或缺的基础。 什么是RESTful API&#xff1f; 让我们将RESTful …

SCI一区TOP|常青藤优化算法(IVYA)原理及实现【免费获取Matlab代码】

目录 1.背景2.算法原理2.1算法思想2.2算法过程 3.结果展示4 .参考文献5.代码获取 1.背景 2024年&#xff0c;M Ghasemi受到自然界中常青藤生长行为启发&#xff0c;提出了常青藤优化算法&#xff08;Ivy Algorithm, IVYA&#xff09;。 2.算法原理 2.1算法思想 IVYA模拟常青…

【Linux】环境基础开发工具使用(yum、vim、gcc/g++、gdb、make/Makefile)

文章目录 Linux 软件包管理器 yumLinux开发工具Linux编辑器-vim使用vim的基本概念vim下各模式的切换vim命令模式各命令汇总vim底行模式各命令汇总批量化注释和批量化去注释vim简单的配置解决一个小问题 Linux编译器-gcc/g作用gcc/g 语法预处理编译汇编链接什么是函数库 Linux调…

【后端】websocket学习笔记

文章目录 1. 消息推送常见方式1.1 轮询 VS 长轮询1.2 SSE&#xff08;server-sent event)服务器发送事件 2. websocket介绍2.1 介绍2.2 原理2.3 websoket API2.3.1 客户端【浏览器】API2.3.2 服务端API 3. 代码实现3.1 流程分析3.2 pom依赖3.3 配置类3.4 消息格式3.5 消息类 4.…

Weevil-Optimizer象鼻虫优化算法的matlab仿真实现

目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.本算法原理 5.完整程序 1.程序功能描述 Weevil-Optimizer象鼻虫优化算法的matlab仿真实现&#xff0c;仿真输出算法的优化收敛曲线&#xff0c;对比不同的适应度函数。 2.测试软件版本以及运行结果展示…

速盾:分享一些cdn加速的原理和技术方面的知识

CDN&#xff08;内容分发网络&#xff09;是一种将内容分发到全球各地的网络架构&#xff0c;旨在提供快速、可靠的内容传输服务。CDN加速的原理和技术主要包括以下几个方面&#xff1a; 负载均衡&#xff1a;CDN使用负载均衡算法将用户请求分发到最近的服务器&#xff0c;以减…