learn C++ NO.15——priority_queue与反向迭代器

news2024/11/14 13:31:14

priority_queue是什么?

priority_queue即优先级队列,它是一个STL库中的容器适配器,底层是用堆实现的。它常被用于解决topK问题。
在这里插入图片描述

priority_queue的使用

由于是容器适配器,所以它并不支持迭代器去遍历容器。使用的接口与stack、queue类似。
在这里插入图片描述
在这里插入图片描述
通过演示不难发现,优先级队列默认是一个大根堆,即top()就是堆中的最大值。这又有一个奇怪的点了,上面在看文档的时候,我们发现priority_queue的第三个模板参数是一个less<…>。那么意味着建立小根堆就要第三个模板参数要传greater。
在这里插入图片描述

对于内置类型可以通过传less<内置类型>和greater<内置类型>来控制建堆。对于自定义类型呢?需要类重载operator<或operator>,或是使用仿函数。仿函数等会儿会有介绍。

对于容器的选择方面,由于建堆、插入数据、删除数据都需要大幅度的使用operator[],容器为vector最佳。

下面通过一道oj来感受一下堆的实景应用场景
在这里插入图片描述
其实这里建大堆或建小堆都可以解决问题,下面我们依次看。首先,我演示一个最暴力的方法,即直接调用排序来解决该问题。
在这里插入图片描述
下面使用建大堆来解决问题。通过vector迭代器区间构造一个大根堆,然后再pop k-1次即可。这样的时间复杂度是O(N),但是空间复杂度也需要O(N),因此在大数据的解决topK问题下,可能并不合适。

在这里插入图片描述
最后我们通过建一个k个数的小堆来解决问题。思路如下,先用vector前k个元素构造一个小根堆。然后从k个位置开始一次遍历vector与堆顶元素比较,比堆顶元素大就pop(),然后在插入这个数即可。遍历完剩余的vector元素后,堆顶元素就是第k大的数。相较于建大堆,空间复杂度方面更为优秀,在大数据场景下的内存压力较小。
在这里插入图片描述

priority_queue模拟实现

核心接口

priority_queue其中最核心的就是向上调整接口和向下调整接口。向下调整接口和向上调整接口都用于是容器适配器维持堆的属性。向下调整通常用于建堆、pop()时维持容器适配器堆的结构。向上调整用于插入数据时调用以维持priority_queue堆的结构

先实现一个向下调整接口,实现思路如下,由于是向下调整需要注意通过父亲位置获取左孩子的位置的公式是child = (parent - 1) / 2。向下调整的结束标识就是当child 比 最后一个元素的位置大时就应该结束比较了。每一次比较的逻辑是,让父亲位置的元素与左孩子和右孩子较大的那个位置根据大小堆性质进行比较。若交换条件成立交换父子位置的元素,并迭代父子位置。反之则退出比较逻辑。
在这里插入图片描述

有一个向下调整接口还是不能满足priority_queue的应用场景。通常priority_queue的容器都是vector,而vector不支持头插头删数据,因此需要从尾部插入数据,并从这个位置向上调整以维持堆的结构。

具体实现思路如下,首先,我们需要从child节点的下标推算出parent节点的下标,parent = (child - 1) / 2。向上调整的整体逻辑是让父子节点进行比较,符合条件就让父子节点交换,然后继续迭代进行下一次的判断。直到父子节点不符合交换条件或者子节点已经在堆顶了那么结束循环。

在这里插入图片描述

仿函数

这样实现向上调整和向下调整还不够泛型,如何让我们这一份代码既可以生成大堆,又可以生成小堆呢?答案是借助仿函数(函数对象)来实现比较类型的泛型。下面简单来看一看。
在这里插入图片描述
下面在priority_queue的实现引入一个模板参数Compare用于传递仿函数来对比较的状态进行控制,使得通过不同的模板参数,让priority_queue 既可以生成大堆,又可以生成小堆。

在这里插入图片描述
看了Compare模板对于内置类型的处理,再看看对于自定义类型的处理。库里的less、greater要求自定义类型实现operator>和operator<。
`
下面再给大家看一个比较特殊的场景,以加深对仿函数的理解。
在这里插入图片描述
由于这里push的new的空间地址,此时greater是按照地址大小进行比较,显然这不符合小根堆的需求。那么我们可以写一个仿函数当作模板参数传过去给priority_queue。
在这里插入图片描述

从样例中可以感受到仿函数对c++编程带来了更多的灵活性和表达力。

基本接口

接下来就实现一下其他的基本接口,首先实现一下迭代器区间初始化建堆的构造函数。依次尾插数据到容器中,然后从第一个非叶子节点位置开始从后向前遍历容器依次向下调整建堆即可。
在这里插入图片描述

push()接口的实现思路就是先调用容器的push_back()接口,然后将插入的元素进行一次向上调整即可。
在这里插入图片描述

pop()接口实现思路如下,现将堆顶元素与最后一个元素交换一下,然后调用容器的pop_back()接口,最后对堆顶元素进行一次向下调整。

在这里插入图片描述
其余接口就不多赘述了,这里直接给出参考代码。
在这里插入图片描述

反向迭代器

反向迭代器也是一种适配器模式。所以,反向迭代器可以用正向迭代器进行封装适配。具体可以怎么实现呢?首先看一看STL库里是怎么做的。
在这里插入图片描述
在这里插入图片描述
通过观察库里的时限可以发现,其实反向迭代器的实现就像模板一样,你传什么容器的迭代器给我,我就实例化一份对应的反向迭代器。下面我就通过一份简单的反向迭代器的代码来一探究竟。
在这里插入图片描述
下面简单测试一下
在这里插入图片描述

总结

本篇文章介绍了priority_queue的使用和模拟实现,又通过priority_queue第三个模板参数Compare介绍了什么是仿函数,以及仿函数的具体使用场景。感受了仿函数带来的一种对于类的状态的一种泛型,使得在实现priority_queue是不用针对大堆或小堆写独立的代码,大幅度减少了工程代码的冗余。最后,介绍了反向迭代器并实现了一个简易版本的反向迭代器,了解了反向迭代器的实际思路和底层实现。

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

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

相关文章

智能物流新“黑神话”:各位“天命人”,这份行业应用锦集请收下!

全球工业革新浪潮中&#xff0c;智能物流正成为制造业转型升级的核心驱动力之一。高柔性的智能物流解决方案可以帮助企业应对复杂的物流挑战&#xff0c;实现生产到仓储全过程的智能化、柔性化和高度集成&#xff0c;带来显著的经济效益。 作为行业领先的全场景柔性物流综合解…

经验证的稳定RSV-pre-F三聚体蛋白--助力疫苗领域百亿蓝海市场角逐战

前 言 历经六十年&#xff0c;RSV疫苗终于上市。今年上半年&#xff0c;美国FDA先后批准GSK和辉瑞的RSV疫苗上市&#xff0c;主要用于60岁以上老年人&#xff0c;且辉瑞的疫苗扩展到妊娠32-36周的孕妇。至此RSV疫苗的百亿蓝海市场角逐战正式打响。 RSV概述 RSV&#xff08;…

【数据结构】排序算法系列——希尔排序(附源码+图解)

希尔排序 算法思想 希尔排序&#xff08;Shell Sort&#xff09;是一种改进的插入排序算法&#xff0c;希尔排序的创造者Donald Shell想出了这个极具创造力的改进。其时间复杂度取决于步长序列&#xff08;gap&#xff09;的选择。我们在插入排序中&#xff0c;会发现是对整体…

开源 AI 智能名片 S2B2C 商城系统在人仓合一平台招募社区合伙人模式中的应用与价值

摘要&#xff1a;本文主要探讨人仓合一平台招募社区合伙人的模式&#xff0c;分析其对流量整合与变现的意义。重点阐述开源 AI 智能名片 S2B2C 商城系统在该模式中的应用&#xff0c;包括如何助力合伙人盘活微信群流量、整合客户资源、实现商品信息推广以及推动流量变现&#x…

从传统编程到低代码,企业如何以更低成本、更快速度交付项目,推动年收入增长

在这数字化转型的大潮中&#xff0c;商业环境也发生着巨大的变化&#xff0c;企业对于项目交付的速度、质量和成本控制都有着越来越高的要求。传统编程模式的门槛高、开发周期长&#xff0c;各方面的成本算下来&#xff0c;成为企业快速发展的瓶颈。低代码开发的兴起&#xff0…

AcWing算法基础课-788逆序对的数量-Java题解

大家好&#xff0c;我是何未来&#xff0c;本篇文章给大家讲解《AcWing算法基础课》788 题——逆序对的数量。本文详细讲解了如何通过归并排序算法高效计算数组中的逆序对数量。通过递归分治和归并过程&#xff0c;我们不仅实现了数组的排序&#xff0c;还在排序过程中巧妙地计…

【深度学习】【图像分类】【OnnxRuntime】【C++】ResNet模型部署

【深度学习】【图像分类】【OnnxRuntime】【C】ResNet模型部署 提示:博主取舍了很多大佬的博文并亲测有效,分享笔记邀大家共同学习讨论 文章目录 【深度学习】【图像分类】【OnnxRuntime】【C】ResNet模型部署前言模型转换--pytorch转onnxWindows平台搭建依赖环境ONNXRuntime推…

这种钛镍合金不简单!强度高且模量低,制造过程也不难

大家好&#xff0c;今天我们要来聊聊一种神奇的合金——《A polymer-like ultrahigh-strength metal alloy》发表于《Nature》。在许多新兴技术中&#xff0c;比如变形飞机和超人型人工肌肉&#xff0c;都需要一种既强又灵活的金属合金。但长久以来&#xff0c;要实现这种“强而…

电商品牌假货要怎么处理

在电商蓬勃发展的今日&#xff0c;假货问题如影随形&#xff0c;严重威胁着品牌的声誉与市场的健康。力维网络以专业打假服务&#xff0c;为品牌保驾护航。 一、精准监测&#xff0c;揪出假货端倪 力维网络的数据监测系统犹如一张严密的大网&#xff0c;覆盖全网。通过全面采集…

828华为云征文 | 华为云Flexus X实例上实现Docker容器的实时监控与可视化分析

前言 华为云Flexus X&#xff0c;以顶尖算力与智能调度&#xff0c;引领Docker容器管理新风尚。828企业上云节之际&#xff0c;Flexus X携手前沿技术&#xff0c;实现容器运行的实时监控与数据可视化&#xff0c;让管理变得直观高效。无论是性能瓶颈的精准定位&#xff0c;还是…

揭晓2024年上半年热门跨境电商平台排行榜完整版,排在第二的居然是它!

随着全球电商市场的持续发展和融合&#xff0c;跨境电商平台已成为众多商家拓展国际市场的重要渠道。面对琳琅满目的平台选择&#xff0c;卖家如何做出明智的决策&#xff0c;成为了关注的焦点。本文将从今年上半年GMV这个维度来盘点一下热门电商平台的最新排行榜&#xff0c;有…

qwen2 VL 多模态图文模型;图像、视频使用案例

参考&#xff1a; https://huggingface.co/Qwen/Qwen2-VL-2B-Instruct 模型&#xff1a; export HF_ENDPOINThttps://hf-mirror.comhuggingface-cli download --resume-download --local-dir-use-symlinks False Qwen/Qwen2-VL-2B-Instruct --local-dir qwen2-vl安装&#x…

你不得不知的日志级别

前言 写日志是一项具有挑战性的任务&#xff0c;在工作中我们常常面临一些困境&#xff0c;比如&#xff1a; 开发人员在编写代码时常常陷入纠结&#xff0c;不确定在何处打印日志才是最有意义的&#xff1b;SRE人员在调查生产问题时可能因为缺乏必要的日志信息而束手无策&am…

基于SSM的“高校学生社团管理系统”的设计与实现(源码+数据库+文档)

基于SSM的“高校学生社团管理系统”的设计与实现&#xff08;源码数据库文档) 开发语言&#xff1a;Java 数据库&#xff1a;MySQL 技术&#xff1a;SSM 工具&#xff1a;IDEA/Ecilpse、Navicat、Maven 系统展示 系统结构图 首页 注册 登录 后台首页界面 社团公告页面 留…

Engage2024用户大会成功举办,数聚股份携手销售易共绘数字化转型新篇章

2024年9月5日&#xff0c;销售易第六届用户大会Engage2024在上海盛大举行。销售易&#xff0c;作为唯一一家入选Gartner SFA魔力象限、且产品能力全球前四的国产CRM软件&#xff0c;当之无愧是国产CRM软件的龙头&#xff0c;其用户大会自然就是CRM领域盛会&#xff0c;汇聚了众…

生命周期函数

所有继承MonoBehavior的脚本 最终都会挂载到Gameobiject游戏对象上 1.生命周期西数 就是该脚本对象依附的Gameobject对象从出生到消亡整个生命周期中 会通过反射自动调用的一些特殊函数 2.Unity帮助我们记录了一个Gameobject对象依附了哪些脚本 会自动的得到这些对象&#x…

视频监控系统中的云镜控制PTZ详细介绍,以及视频监控接入联网平台相关协议对PTZ的支持

目录 一、PTZ概述 二、PTZ 控制的应用场景 1、公共场所 2、安全监控 3、交通监控 4、工业生产环境中的质量监控 5、大型活动的现场直播或录制 三、PTZ摄像的优缺点 1、优点 2、缺点 四、PTZ控制的基本原理 1、云台控制 2、镜头控制 五、 PTZ 控制协议 1. Pelco-…

深度学习时遇到tensor([0.], device=‘cuda:0‘)等输出

更改了数据集后进行训练遇到了以下输出&#xff0c;精度正常提升&#xff0c;训练正常&#xff0c;就是精度和map之间又很多输出&#xff0c;如下&#xff1a; tensor([0.], devicecuda:0), tensor([0.], devicecuda:0), tensor([0.], devicecuda:0), tensor([0.], devicecuda…

NAT技术+代理服务器+内网穿透

NAT技术 IPv4协议中&#xff0c;会存在IP地址数量不充足的问题&#xff0c;所以不同的子网中会存在相同IP地址的主机。那么就可以理解为私有网络的IP地址并不是唯一对应的&#xff0c;而公网中的IP地址都是唯一的&#xff0c;所以NAT&#xff08;Network Address Translation&…

往复密封问题的两个问题

&#x1f3c6;本文收录于《CSDN问答解惑-专业版》专栏&#xff0c;主要记录项目实战过程中的Bug之前因后果及提供真实有效的解决方案&#xff0c;希望能够助你一臂之力&#xff0c;帮你早日登顶实现财富自由&#x1f680;&#xff1b;同时&#xff0c;欢迎大家关注&&收…