深入理解C++优先级队列:原理解析与代码实战

C嘎嘎探索篇:优先级队列:在数据之舞中揭开算法的艺术面纱

前言:

小编在前几日刚刚完成了栈和队列相关内容的书写,今天小编在讲一种特殊的队列,它的名字叫做优先级队列,细心的读者朋友可能会发现在queue这个头文件中,不仅仅只有queue适配器,还有一个priority_queue适配器,这就是优先级队列,虽然说它的名字中队列这里两个字,但其实它就是我们曾经学习过的堆结构,下面我们小编就进入优先级队列的讲解环节。

img

文章目录

  • C嘎嘎探索篇:优先级队列:在数据之舞中揭开算法的艺术面纱
    • 1.priority_queue的介绍和使用
      • 1.1.priority_queue的介绍
      • 1.2.priority_queue的使用
        • 1.2.1.priority_queue()
        • 1.2.2.empty()
        • 1.2.3.push(x)
        • 1.2.4.pop()
        • 1.2.5.size()
        • 1.2.6.top()
    • 2.总结

正文:

1.priority_queue的介绍和使用

1.1.priority_queue的介绍

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

优先级队列是一种容器适配器,根据严格的弱排序标准,它的第一个元素在它包含的元素中最大的,它就是我们之前在数据结构阶段实现的大堆结构,当时我们堆是用顺序表进行时间的(顺序二叉树),所以此时我们的优先级队列同样可以用vector进行封装,所以它此时不再是一个容器,而是一个容器的适配器,在等会的模拟实现中相信各位可以更好的知晓这个特点,可能有很多读者朋友并没有学过堆这个数据结构,那么可以看看小编之前写过的堆结构的文章:数据结构——原来二叉树可以这么学?(2:堆的详解)-CSDN博客,在这篇文章中我就详细介绍了堆的相关概念和如何去实现的,我推荐各位看一看这个文章,避免等会听的懵逼,因为我是默认大家是会堆这个结构的,下面废话不多说,小编介绍一下优先级队列相关的功能。

1.2.priority_queue的使用

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

通过上图可以看出,优先级队列的功能和之前小编讲过的栈和队列一样都很少,因为堆这个结构也是很特殊的,它是一个二叉树样子的结构,每次我们插入元素的时候都需要用到调整建堆的方法来维持大堆或者小堆,堆是小编认为数据结构中比较麻烦的结构之一,下面我就开始讲述一下相关接口,和之前一样,功能小编一般就讲述一部分的功能,如果全讲出来也是没有什么必要的,因为有些功能说实在的是有一些鸡肋的,所以我就挑重点的进行讲述,感兴趣的读者朋友可以自行探索别的功能。

函数声明接口说明
priority_queue()构造一个空的优先级队列
empty()检测优先级队列是否为空,是返回true,否 则返回false
push(x)返回优先级队列中最大(最小元素),即堆顶元 素
pop()在优先级队列插入x
top()删除优先级队列中最大(最小)元素,即堆顶元素
1.2.1.priority_queue()

这个接口的写法在大多数容器和适配器都能体现出来,它其实就是我们熟悉的构造函数,只不过这个是不带参的构造函数,所以我们用它的时候,会建造一个空的优先级队列,用堆的话来讲,就是制造一个空的堆,下面小编展示和这个接口的用法:

using namespace std;
priority_queue<int> s1;  //这样就可以构造一个空的优先级队列
1.2.2.empty()

这个接口的功能也是很好去记忆的,它的功能和它的名字是相互对应着的,所以它的功能就是判断优先级队列是否为空,如果为空的话就返回真,如果满的滑稽就返回假,下面小编展示它的用法:

using namespace std;
priority_queue<int> s1;
if(s1.empty())
{cout << 1 << endl;
}
cout << 2 << endl; //很明显此时我并没有进行入堆的操作,所以此时为空,打印的是1,这里我就不展示结果了
1.2.3.push(x)

这个函数的作用同样也是十分的容易,它一眼看去就是一个插入元素的函数,只不过这个函数其实底层并不只是简单的进行插入元素的操作,小编说过,优先级队列就是我们之前学习过的堆结构,堆结构我们在插入元素(入堆)的时候就涉及到了元素的调整问题,此时的插入接口也会进行这样的操作,这和队列的优先级有关,它的优先级的控制是由仿函数决定的,对于仿函数的介绍,小编会在下一篇对于优先级队列的模拟实现中好好给各位进行讲述的(本来想一篇文章写完的,但是一篇分为两篇也不是不行,(#.#)),下面小编展示它的用法:

using namespace std;
priority_queue<int> s1;
s1.push(5);
s1.push(3);
s1.push(4);
s1.push(1);  //因为此时的优先级队列默认是大堆,也就是最大元素在最上面,所以此时里面应该是5 3 4 1
1.2.4.pop()

有入堆操作,肯定就有出堆操作,pop这个函数各位也是不陌生了,只不过此时的删除也不是单纯的删除,小编在讲堆的时候,说过出堆操作其实是把第一个元素删除,只不过需要先把堆第一个数据和最后一个数据交换,然后尾删,这样做的话不会破坏中间的二叉树结构,我们仅需在进行一次简单的调整就好了,下面小编展示它的用法:

using namespace std;
priority_queue<int> s1;
s1.push(5);
s1.push(3);
s1.push(4);
s1.push(1);  //因为此时的优先级队列默认是大堆,也就是最12大元素在最上面,所以此时里面应该是5 3 4 1
s1.pop(); //此时把5进行了删除,此时队列里面是:4 3 1
1.2.5.size()

这个函数的作用也很简单,它就是返回优先级队列有效元素的个数,所以我就直接展示它的用法了:

using namespace std;
priority_queue<int> s1;
cout << s1.size() << endl; //此时没有插入元素,所以大小应该是0
1.2.6.top()

这个函数的作用也是很好去理解的,它的作用和它的名字一样,就是取堆顶的元素,此时我们通过这个函数,再搭配其他的函数,就可以实现出遍历一个优先级队列的操作,下面小编展示它的用法:

using namespace std;
priority_queue<int> s1;
s1.push(1);
s1.push(2);
s1.push(3);
s1.push(4);
while(!s1.empty())
{cout << s1.top() << " ";s1.pop();
}
cout << endl;

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

以上便就是小编对于优先级队列的讲解,这些功能最好去记一下,毕竟堆也是我们之前学过的一个比较重要的数据结构,只不过我还是认为,它的难度还是不大使用起来,只不过在模拟实现的时候会稍微有一点困难,只不过本文我就不写它的模拟实现了,我准备在下一篇文章着重写对于它的模拟实现,各位读者朋友敬请期待吧~
在这里插入图片描述

2.总结

本文到这也就结束了,虽然文章的篇幅总体不算很大的,但我认为内容还是蛮丰富的,小编在这篇文章着重的讲述了优先级队列相关的功能,希望各位读者朋友要好好的去理解,最近感觉时间都不够用了,这篇文章我也是鸽了好久才写完,希望以后我可以好好的去分配自己的时间,有点贪玩了,如果文章有任何错误,可以在评论区指出,我会及时的去更改错误,那么各位大佬们,我们下一篇文章见啦~

能,希望各位读者朋友要好好的去理解,最近感觉时间都不够用了,这篇文章我也是鸽了好久才写完,希望以后我可以好好的去分配自己的时间,有点贪玩了,如果文章有任何错误,可以在评论区指出,我会及时的去更改错误,那么各位大佬们,我们下一篇文章见啦~

img

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

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

相关文章

SpringBoot:快速构建微服务应用

一、SpringBoot简介 什么是SpringBoot 是由Pivotal团队提供的快速开发框架。它基于Spring框架&#xff0c;可以用于快速构建微服务应用程序。SpringBoot提供了一种快速、便捷的方式来启动和配置一个基于Spring的应用程序&#xff0c;它封装了很多常用的配置&#xff0c;简化了开…

轻量级日志管理平台:Grafana Loki搭建及应用(详细篇)

前言 Grafana Loki是Grafana Lab团队提供的一个水平可扩展、高可用性、多租户的日志聚合系统&#xff0c;与其他日志系统不同的是&#xff0c;Loki最初设计的理念是为了为日志建立标签索引&#xff0c;而非将原日志内容进行索引。 现在目前成熟的方案基本上都是&#xff1a;L…

ansible自动化运维(四)jinjia2模板

Jinjia2模板 前面说到playbook组成的时候&#xff0c;有介绍到template模块&#xff0c;而template模块对模板文件进行渲染时&#xff0c;使用的就是jinja2模板引擎&#xff0c;jinja2本身就是基于python的模板引擎&#xff0c;所以下面先来了解一下jinjia2模板的一些用法 基…

光谱相机

光谱相机是一种能够同时获取目标物体的空间图像信息和光谱信息的成像设备。 1、工作原理 光谱相机通过光学系统将目标物体的光聚焦到探测器上&#xff0c;在探测器前设置分光元件&#xff0c;如光栅、棱镜或滤光片等&#xff0c;将光按不同波长分解成多个光谱通道&#xff0c…

LLM 分布式训练六大关键技术介绍

编者按&#xff1a; 本文聚焦于分布式去中心化神经网络训练技术&#xff0c;作者系统阐述了在大规模模型训练中提高硬件使用效率的创新方法。 文章重点阐述了六种关键的分布式训练技术&#xff1a; 数据并行训练&#xff1a;通过将数据 mini-batches 分散到多个 workers&#x…

【记录】Django解决与VUE跨域问题

1 梗概 这里记录Django与VUE的跨域问题解决方法&#xff0c;主要修改内容是在 Django 中。当然其他的前端项目 Django 也可以这样处理。 2 安装辅助包 pip install django-cors-headers3 配置 settings.py INSTALLED_APPS [ # ... corsheaders, # ... ] 为了响应…

跨平台开发技术的探索:从 JavaScript 到 Flutter

随着多平台支持和用户体验一致性在应用程序开发中变得越来越重要,开发者面临的挑战是如何在不同平台上保持代码的可维护性和高效性。本文将探讨如何利用现代技术栈,包括 Flutter、JavaScript、HTML5、WebAssembly、TypeScript 和 Svelte,在统一的平台上进行高效的跨平台开发…

队列+宽搜_429. N 叉树的层序遍历_二叉树最大宽度

429. N 叉树的层序遍历 定义一个队列q&#xff0c;将一层的节点入队&#xff0c;并记录节点个数。根据节点的个数&#xff0c;出队列&#xff0c;并将其孩子入队列。出完队列&#xff0c;队列当前剩余节点的个数就是下次出队列的次数。直到队列为空 /* // Definition for a Nod…

语音芯片赋能可穿戴设备:开启个性化音频新体验

在科技日新月异的今天&#xff0c;语音芯片与可穿戴设备的携手合作&#xff0c;正引领我们步入一个前所未有的个性化音频时代。这一创新融合&#xff0c;用户可以享受到更加个性化、沉浸式的音频体验。下面将详细介绍语音芯片与可穿戴设备合作的优点和具体应用。 1. 定制化音效…

单片机学习笔记 18. IIC总线EEPROM(理论)

更多单片机学习笔记&#xff1a;单片机学习笔记 1. 点亮一个LED灯单片机学习笔记 2. LED灯闪烁单片机学习笔记 3. LED灯流水灯单片机学习笔记 4. 蜂鸣器滴~滴~滴~单片机学习笔记 5. 数码管静态显示单片机学习笔记 6. 数码管动态显示单片机学习笔记 7. 独立键盘单片机学习笔记 8…

【机器学习】手写数字识别的最优解:CNN+Softmax、Sigmoid与SVM的对比实战

一、基于CNNSoftmax函数进行分类 1数据集准备 2模型设计 3模型训练 4模型评估 5结果分析 二、 基于CNNsigmoid函数进行分类 1数据集准备 2模型设计 3模型训练 4模型评估 5结果分析 三、 基于CNNSVM进行分类 1数据集准备 2模型设计 3模型训练 4模型评估 5结果分…

TOSUN同星TsMaster使用入门——2、使用TS发送报文,使用graphics分析数据等

在第一章里面已经介绍了关于同星工程的创建和最基础的总线分析&#xff0c;接下来看看怎么使用TS发送报文以及图形化分析数据。 目录 一、使用Graphics分析报文信号/变量&#xff08;对标CANoe Graphics&#xff09; 二、使用数值窗口统计信号值/变量 三、使用TS发送报文 3…

【老白学 Java】日期 / 时间格式化

日期 / 时间格式化 文章来源&#xff1a;《Head First Java》修炼感悟。 本篇文章&#xff0c;老白把日期和时间的格式化参数进行了整理&#xff0c;方便以后查阅&#xff0c;更加详细的说明请参考 Java API 文档。 一、语法解释 %&#xff0c;必要参数&#xff0c;用于引用参…

分布式 Paxos算法 总结

前言 相关系列 《分布式 & 目录》《分布式 & Paxos算法 & 总结》《分布式 & Paxos算法 & 问题》 参考文献 《图解超难理解的 Paxos 算法&#xff08;含伪代码&#xff09;》《【超详细】分布式一致性协议 - Paxos》 Basic-Paxos 基础帕克索斯算法…

【嵌入式软件】跑开发板的前置服务配置

在嵌入式开发中,通常需要在 开发板和主机之间共享、传输和挂载文件。 这篇文章是关于如何在 Ubuntu 中配置 Samba、TFTP 和 NFS 协议的详细步骤。这些协议分别用于远程文件共享、文件传输和内核挂载文件系统。 如何安装协议: 参考:ubuntu18配置:详细的内容我手写了一份文档。…

IntelliJ IDEA 使用技巧与插件推荐

目录 常用使用技巧 1. 使用快捷键提升开发效率 2. 多光标编辑 3. 代码自动补全 4. 使用 Find Action 快速执行操作 5. 集成版本控制系统&#xff08;VCS&#xff09; 6. 快速查看代码文档 推荐插件 1. Lombok Plugin 2. Rainbow Brackets 3. Key Promoter X 4. Chec…

如何对小型固定翼无人机进行最优的路径跟随控制?

控制架构 文章继续采用的是 ULTRA-Extra无人机&#xff0c;相关参数如下&#xff1a; 这里用于guidance law的无人机运动学模型为&#xff1a; { x ˙ p V a cos ⁡ γ cos ⁡ χ V w cos ⁡ γ w cos ⁡ χ w y ˙ p V a cos ⁡ γ sin ⁡ χ V w cos ⁡ γ w sin ⁡ χ…

VR虚拟展厅的实时互动是如何实现的?

VR虚拟展厅的实时互动是通过一系列技术和流程实现的&#xff0c;这些技术和流程共同确保了用户在虚拟环境中的互动体验能够及时响应和更新。 接下来&#xff0c;由专业从事VR虚拟展厅制作的圆桌3D云展厅平台为大家介绍一下实现VR虚拟展厅实时互动的几个关键要素&#xff1a; 高…

(三)FT2232HL高速调试器的接口定义与使用配置说明

&#xff08;特别声明&#xff1a;仅对FT2232HL_v0.2 20241125版本进行电路优化调整&#xff09; 如果FT2232HL板子是V0.2版本&#xff08;背面丝印FT2232HL_v0.2 20241125&#xff09;&#xff0c;类似下图这样的&#xff0c;说明已经对电路进行了优化调整。 1、接口定义 FT…

C++20 标准概念

1. 所有标准概念的概述 “类型和对象基本概念”表列出了类型和对象的基本概念。 “范围、迭代器和算法概念”表列出了范围、视图、迭代器和算法的概念。 “辅助概念”表列出的概念主要用作其他概念的构建块&#xff0c;通常不会让应用程序开发者直接使用。 头文件和命名空间 …