C++——优先级队列

前言:这篇文章我们继续来分享一个c++的容器——优先级队列。


一.理解优先级

何为优先级一说?实际上就是有顺序的意思。

优先级队列,即有顺序的队列,是一个无需我们自己进行排序操作,在数据传入时就会由容器自己排好序的队列

先来看实例:

使用该队列,同样需要包含头文件#include<queue>

在默认情况下,优先级队列是按照从大到小排序的,而在数据结构中,也有一个能够自主排序,没错,就是从大到小的顺序,也就是大堆

那么如果想要实现小堆,又该怎么办呢?只需要增加一下模版参数

至于为什么这样写就是小堆,我们再接下来的模拟实现中进行解答。


二.基本框架

堆可以通过父节点或字节点的下标来互相找到对方的下标,所以一般情况都以数组为模板。 

	template <class T,class Container = vector<T>>class priority_queue{public://向上调整void adjust_up(size_t child){int parent = (child - 1) / 2;while (child > 0){if (_con[child] > _con[parent]){swap(_con[child], _con[parent]);child = parent;int parent = (child - 1) / 2;}else{break;}}}//向下调整void adjust_down(size_t parent){size_t child = parent * 2 + 1;while (child < _con.size()){if (child + 1 < _con.size() && _con[child + 1] > _con[child]){++child;}if (_con[child] > _con[parent]){swap(_con[child], _con[parent]);parent = child;child = parent * 2 + 1;}else{break;}}}//插入void push(const T& x){_con.push_back(x);adjust_up(_con.size() - 1);}//删除void pop(){swap(_con[_con.size() - 1], _con[0]);_con.pop_back();adjust_down(0);}//队头元素T& top(){return _con[0];}//数据个数size_t size(){return _con.size();}//判空bool empty(){return _con.empty();}private:Container _con;};

这里我们直接给出优先级队列的基本常规操作,本质就是堆的各种操作,不再一一分享。

而我们要重点分享的,就是如何切换升降序


 三.仿函数

从名字就能看出,这是一个可以冒充函数的家伙,先来看例子:

template <class T>
class less
{
public:bool operator()(const T& x, const T& y){return x < y;}
};

这段代码不难理解,在一个类中声明了一个运算符重载函数,这个函数能够进行大小比较。 

再来看这段代码,能够发现我们能够直接通过一个对象来进行两个数据之间的比较。 

这就是所谓的仿函数。 

上述仿函数是进行“小于”比较,同样我们也可以在创造一个仿函数来进行“大于”比较。

如此一来,我们便可以通过类模板将这两个仿函数用于排序比较


四.实现可选优先级

直接看代码:

	//小于比较template <class T>class less{public:bool operator()(const T& x, const T& y){return x < y;}};//大于比较template <class T>class greater{public:bool operator()(const T& x, const T& y){return x > y;}};template <class T,class Container = vector<T>,class compare = less<T>>//注意class priority_queue{//大堆public://向上调整void adjust_up(size_t child){compare com;//注意int parent = (child - 1) / 2;while (child > 0){if (com(_con[parent], _con[child]))//注意{swap(_con[child], _con[parent]);child = parent;int parent = (child - 1) / 2;}else{break;}}}//向下调整void adjust_down(size_t parent){compare com;//注意size_t child = parent * 2 + 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[child], _con[parent]);parent = child;child = parent * 2 + 1;}else{break;}}}

其中less为小于比较的类,而greater为大于比较的类

而后我们通过使用类模板参数compare将两者整合在一起因为库里的优先级队列默认即为大堆,所以我们使用缺省参数默认为less

前边已经提到,使用仿函数,就是使用对应类的对象,所以我们需要创建compare类的对象com,并传入比较内容进行比较

这里要注意两个比较数据的先后位置,要按照到底是谁大于谁而传入正确的先后顺序。

 

随后就可以按照排序要求对类型进行更改,按照我们的代码方式,less为降序,greater为升序。 


总结

优先级队列的分享到这里就结束啦。

目前为止不难看出C++的这些容器的底层数据结构都是我们所学习过的,所以对于掌握容器的使用并不困难。

喜欢本篇文章记得一键三连,我们下期再见~

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

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

相关文章

冒泡排序解读

在信息爆炸的时代&#xff0c;数据无处不在&#xff0c;而如何有效地管理和处理这些数据&#xff0c;成为了现代计算机科学的一个重要课题。排序算法&#xff0c;作为数据处理的基本工具之一&#xff0c;对于数据的组织、搜索和分析起着至关重要的作用。今天&#xff0c;我们就…

在家学机器人技术指南

机器人技术是一个跨学科的领域&#xff0c;涉及计算机科学、电子工程、机械工程、人工智能等多个方面。在家自学机器人技术是完全可能的&#xff0c;但需要有计划和系统的学习路径&#xff0c;以及对相关领域的基础知识有一定的了解。 以下是一些建议&#xff0c;可以帮助你在家…

Jeecg的Dict注解的用法

Jeecg 是一个基于代码生成器的快速开发框架&#xff0c;它提供了一系列的注解来简化开发过程。其中&#xff0c;Dict 注解是用于将数据库中的数据字典值转换成具体含义的注解。 通常情况下&#xff0c;在数据库中&#xff0c;一些字段的值可能是数字或者代码&#xff0c;而不是…

[C++][算法基础]合并集合(并查集)

一共有 n 个数&#xff0c;编号是 1∼n&#xff0c;最开始每个数各自在一个集合中。 现在要进行 m 个操作&#xff0c;操作共有两种&#xff1a; M a b&#xff0c;将编号为 a 和 b 的两个数所在的集合合并&#xff0c;如果两个数已经在同一个集合中&#xff0c;则忽略这个操…

力扣刷题Days33-209. 长度最小的子数组(js)

目录 1&#xff0c;题目-滑动窗口 2&#xff0c;代码 滑动窗口 3&#xff0c;学习与总结 1&#xff0c;题目-滑动窗口 给定一个含有 n 个正整数的数组和一个正整数 target 。找出该数组中满足其总和大于等于 target 的长度最小的 连续子数组 [numsl, numsl1, ..., numsr-1,…

动态路由-基于vue-admin-template

基于 vue-admin-template的动态路由 1. 拆分静态路由与动态路由 静态路由----所有人都可以访问—首页/登录/404 动态路由–有权限的人才可以访问—组织/角色/员工/权限 2. 根据用户权限添加动态路由 获取对应的权限标识(vuex中actions中把用户资料通过return 进行返回&…

AI创业项目:AI旅游规划定制师

在当前的旅游市场中&#xff0c;个性化旅游规划成为越来越多旅行者的需求。然而&#xff0c;现行的定制旅行服务主要依赖于人工定制师&#xff0c;这一模式面临着信息不透明、价格弹性大等挑战。定制师在客户与服务供应商之间掌握着信息差&#xff0c;依靠这一优势获得收益&…

代码算法训练营day14 | 理论基础、递归遍历

day14&#xff1a; 理论基础二叉树的分类&#xff1a;二叉树的种类&#xff1a;满二叉树完全二叉树二叉搜索树平衡二叉搜索树 二叉树的存储方式&#xff1a;链式存储顺序存储 二叉树的遍历方式&#xff1a;深度优先和广度优先遍历实现方式 二叉树的定义&#xff1a; 递归遍历递…

(学习日记)2024.04.11:UCOSIII第三十九节:软件定时器

写在前面&#xff1a; 由于时间的不足与学习的碎片化&#xff0c;写博客变得有些奢侈。 但是对于记录学习&#xff08;忘了以后能快速复习&#xff09;的渴望一天天变得强烈。 既然如此 不如以天为单位&#xff0c;以时间为顺序&#xff0c;仅仅将博客当做一个知识学习的目录&a…

Vue文档

Vue是什么&#xff1f;为什么要学习他 Vue是什么&#xff1f; Vue是前端优秀框架&#xff0c; 是一套用于构建用户界面的渐进式框架 为什么要学习Vue Vue是目前前端最火的框架之一Vue是目前企业技术栈中要求的知识点Vue可以提升开发体验Vue学习难度较低… Vue开发前的准备 安…

JavaScript PAT乙级题解 1057 数零壹

给定一串长度不超过 105 的字符串&#xff0c;本题要求你将其中所有英文字母的序号&#xff08;字母 a-z 对应序号 1-26&#xff0c;不分大小写&#xff09;相加&#xff0c;得到整数 N&#xff0c;然后再分析一下 N 的二进制表示中有多少 0、多少 1。例如给定字符串 PAT (Basi…

Redis数据倾斜

Redis 数据倾斜问题通常出现在分布式 Redis 环境中&#xff0c;尤其是 Redis 集群环境。这意味着一部分节点承载了比其他节点更多的数据或者接收的请求更多&#xff0c;导致负载不均衡。数据倾斜可能会对性能和可扩展性造成影响。以下是一些解决数据倾斜的通用策略&#xff1a;…

分享 3 个实时人工智能图像生成工具

如果有人还需要开源人工智能技术快速发展的实例&#xff0c;那就是实时 Diffusion 。一年前&#xff0c;如果想分析单个单词对图像提示的影响&#xff0c;甚至尝试使用 Diffusion 模型替换视频中的面孔&#xff0c;需要两件事&#xff1a; 处理开源代码自建 WEB 应用程序 到 …

cexprtk:Python中的数学表达式解析和计算

1 安装 可以使用 pip 安装&#xff1a; pip install cexprtk 注意&#xff1a;安装需要安装兼容的 C 编译器。 2 用法 1&#xff09;示例&#xff1a;计算一个简单的方程 计算算术表达式 (55) * 23 import cexprtk cexprtk.evaluate_expression("(55) * 23", {}…

springboot项目引入swagger

1.引入依赖 创建项目后&#xff0c;在 pom.xml 文件中引入 Swagger3 的相关依赖。回忆一下&#xff0c;我们集成 Swagger2 时&#xff0c;引入的依赖如下&#xff1a; <dependency><groupId>io.springfox</groupId><artifactId>springfox-swagger2&…

2024智能计算、大数据应用与信息科学国际会议(ICBDAIS2024)

2024智能计算、大数据应用与信息科学国际会议(ICBDAIS2024) 会议简介 智能计算、大数据应用与信息科学之间存在相互依存、相互促进的关系。智能计算和大数据应用的发展离不开信息科学的支持和推动&#xff0c;而信息科学的发展又需要智能计算和大数据应用的不断拓展和应用。智…

Jmeter —— jmeter利用取样器中http发送请求

使用Jmeter发送HTTP请求 取样器是用来模拟用户操作&#xff0c;向服务器发送请求以及接收服务器的响应数 据的一类元件&#xff0c;其中HTTP请求取样器是用来模拟常用的http请求的 步骤如下&#xff1a; 步骤一&#xff1a;添加线程组 右击测试计划——添加——线程&#x…

如何制作exe文件第一步

目录 0.图片链接1.Welcome&#xff08;可跳过&#xff09;2.Project type--作用选择制作jar包的模式3.定义生成exe应用文件命名和输出地址4.配置执行信息4.1配置应用执行显示方式、安装名称、和显示图标4.2是否重定向日志文件&#xff08;根据需要进行选择&#xff09;4.3配置安…

人生建议——别怯

你的每一次胆怯&#xff0c;都是自我能量的“收缩”。 如果一害怕&#xff0c;就找地方躲。 那你永远要忍受恐惧带来的苦果。 成长&#xff0c;其实就是对恐惧的不断突破。 如果你什么都怯懦。 那就只能一直让自己待在角落。 遇到自己能解决的事情。 根本不用害怕。 遇…

Docker使用— Docker部署安装Nginx

Nginx简介 Nginx 是一款高性能的 web 服务器、反向代理服务器以及电子邮件&#xff08;IMAP/POP3/SMTP&#xff09;代理服务器&#xff0c;由俄罗斯开发者伊戈尔塞索耶夫&#xff08;Igor Sysoev&#xff09;编写&#xff0c;并在2004年10月4日发布了首个公开版本0.1.0。Nginx…