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

c++初阶-----适配器---priority_queue

作者前言

🎂 ✨✨✨✨✨✨🍧🍧🍧🍧🍧🍧🍧🎂
​🎂 作者介绍: 🎂🎂
🎂 🎉🎉🎉🎉🎉🎉🎉 🎂
🎂作者id:老秦包你会, 🎂
简单介绍:🎂🎂🎂🎂🎂🎂🎂🎂🎂🎂🎂🎂🎂🎂🎂
喜欢学习C语言、C++和python等编程语言,是一位爱分享的博主,有兴趣的小可爱可以来互讨 🎂🎂🎂🎂🎂🎂🎂🎂
🎂个人主页::小小页面🎂
🎂gitee页面:秦大大🎂
🎂🎂🎂🎂🎂🎂🎂🎂
🎂 一个爱分享的小博主 欢迎小可爱们前来借鉴🎂


priority_queue

  • **作者前言**
  • 介绍
    • 使用
    • 模拟
      • 普通模拟
      • 类似C语言的回调函数方法
      • **仿函数**
        • 小总结

介绍

翻译:

  1. 优先队列是一种容器适配器,根据严格的弱排序标准,它的第一个元素总是它所包含的元素中最大的。
  2. 此上下文类似于堆,在堆中可以随时插入元素,并且只能检索最大堆元素(优先队列中位于顶部的元
    素)。
  3. 优先队列被实现为容器适配器,容器适配器即将特定容器类封装作为其底层容器类,queue提供一组特
    定的成员函数来访问其元素。元素从特定容器的“尾部”弹出,其称为优先队列的顶部。
  4. 底层容器可以是任何标准容器类模板,也可以是其他特定设计的容器类。容器应该可以通过随机访问迭
    代器访问,并支持以下操作:
    empty():检测容器是否为空
    size():返回容器中有效元素个数
    front():返回容器中第一个元素的引用
    push_back():在容器尾部插入元素
    函数声明 接口说明
    priority_queue()/priority_queue(first,0last) 构造一个空的优先级队列
    empty( )
    检测优先级队列是否为空,是返回true,否则返回
    false
    top( ) 返回优先级队列中最大(最小元素),即堆顶元素
    push(x) 在优先级队列中插入元素x
    pop() 删除优先级队列中最大(最小)元素,即堆顶元素
    pop_back():删除容器尾部元素
  5. 标准容器类vector和deque满足这些需求。默认情况下,如果没有为特定的priority_queue类实例化指
    定容器类,则使用vector。
  6. 需要支持随机访问迭代器,以便始终在内部保持堆结构。容器适配器通过在需要时自动调用算法函数
    make_heap、push_heap和pop_heap来自动完成此操作。

使用

#include<iostream>
#include<queue>
using namespace std;
typedef priority_queue<int> i;
int main()
{i qt;qt.push(4);qt.push(5);qt.push(6);qt.push(9);qt.push(1);while (!qt.empty()){cout << qt.top() << endl;qt.pop();}return 0;
}

结果:
在这里插入图片描述
如果要想priority_queue是从小到大可以使用greater 类型

#include<iostream>
#include<vector>
#include<queue>
#include<functional>
using namespace std;
typedef priority_queue<int, vector<int>, greater<int>> i;
int main()
{i qt;qt.push(4);qt.push(5);qt.push(6);qt.push(9);qt.push(1);while (!qt.empty()){cout << qt.top() << endl;qt.pop();}return 0;
}

在这里插入图片描述

模拟

priority_queue的底层是,所以,我们模拟的时候,可以理解为是堆的插入和删除
在这里插入图片描述
可以看出 这个容器有三个类型, T 、 vector 、 less

普通模拟

template<class T, class contaier = vector<T> >
class my_priorty_queue
{
public:void push(const T& num){//尾插a.push_back(num);//建堆,向上调整upajust();}void pop(){//首尾交换swap(a[0], a[a.size() - 1]);//删除尾部a.pop_back();//向下调整downadjust();}void upajust(){this->a;//向上调整,建大堆int i = (this->a).size() - 1;while (i > 0){if (a[i] > a[(i - 1) / 2]){swap(a[i], a[(i - 1) / 2]);i = (i - 1) / 2;}elsebreak;}}void downadjust(){int father = 0;while (father < a.size()){//进行分类,如果没有孩子,只有一个孩子,两个孩子if (a.size()-1< 2 * father + 1)break;else if (a.size() - 1 < 2 * father + 2){if (a[father] < a[2 * father + 1]){swap(a[father], a[2 * father + 1]);}elsebreak;}else{int leftchila = 2 * father + 1;int rightchila = leftchila + 1;int pos = 0;if (a[leftchila] < a[rightchila]){pos = rightchila;}else{pos = leftchila;}if (a[pos] > a[father])swap(a[pos], a[father]);elsebreak;father = pos;}}//孩子比较出最小的}bool empty(){return a.empty();}T top(){assert(a.size());return a[0];}
private:contaier a;};

这样写只能手动改代码进行建立大小堆,不太好用,
我们有两个方法进行控制其中的大小堆,
一个是C语言的的回调函数,一个是c++的仿函数

类似C语言的回调函数方法

template<class T, class contaier = vector<T>>class my_priorty_queue{public:my_priorty_queue(bool(*pf)(T, T)):a(*new contaier()),_pf(pf){}void push(const T& num){//尾插a.push_back(num);//建堆,向上调整upajust();}void pop(){//首尾交换std::swap(a[0], a[a.size() - 1]);//删除尾部a.pop_back();//向下调整downadjust();}void upajust(){this->a;//向上调整,建大堆int i = (this->a).size() - 1;while (i > 0){if (_pf(a[i],a[(i - 1) / 2])){std::swap(a[i], a[(i - 1) / 2]);i = (i - 1) / 2;}elsebreak;}}void downadjust(){int father = 0;while (father < a.size()){//进行分类,如果没有孩子,只有一个孩子,两个孩子if (a.size() - 1 < 2 * father + 1)break;else if (a.size() - 1 < 2 * father + 2){if (_pf(a[2 * father + 1], a[father])){std::swap(a[father], a[2 * father + 1]);}elsebreak;}else{int leftchila = 2 * father + 1;int rightchila = leftchila + 1;int pos = 0;//孩子比较大小if (_pf( a[rightchila], a[leftchila])){pos = rightchila;}else{pos = leftchila;}//孩子和父亲比较if (_pf(a[pos] ,a[father]))std::swap(a[pos], a[father]);elsebreak;father = pos;}}}bool empty(){return a.empty();}T top(){assert(a.size());return a[0];}private:contaier a;bool(*_pf)(T,T);};template<class T >bool funtionmin(T a, T b){return a < b;}template<class T >bool funtionmax(T a, T b){return a > b;}

这样写的话,就有点别扭,实例化要传入函数指针,这和我们使用库函数提供的差别很大

仿函数

本质就是一个类, 这个类重载了(), 可以理解为重载了()的类就是仿函数,
所以,仿函数的调用就是, 对象名(形参, 形参)
例如:

class AA
{void operator()(int a, int b){cout << "a+b=" << a + b;}
};
int main()
{AA elemest;elemest(1,1);return 0;
}

模拟priority_queueu使用仿函数,如图所示,这也就解释了,为啥会有三个类模板参数了

template<class T, class contaier = vector<T> , class conpart = upsortjust<T>> class my_priorty_queue{public:void push(const T& num){//尾插a.push_back(num);//建堆,向上调整upajust();}void pop(){//首尾交换std::swap(a[0], a[a.size() - 1]);//删除尾部a.pop_back();//向下调整downadjust();}void upajust(){this->a;//向上调整,建大堆int i = (this->a).size() - 1;while (i > 0){if (_pf(a[i],a[(i - 1) / 2])){std::swap(a[i], a[(i - 1) / 2]);i = (i - 1) / 2;}elsebreak;}}void downadjust(){int father = 0;while (father < a.size()){//进行分类,如果没有孩子,只有一个孩子,两个孩子if (a.size() - 1 < 2 * father + 1)break;else if (a.size() - 1 < 2 * father + 2){if (_pf(a[2 * father + 1], a[father])){std::swap(a[father], a[2 * father + 1]);}elsebreak;}else{int leftchila = 2 * father + 1;int rightchila = leftchila + 1;int pos = 0;//孩子比较大小if (_pf(a[rightchila], a[leftchila])){pos = rightchila;}else{pos = leftchila;}//孩子和父亲比较if (_pf(a[pos] ,a[father]))std::swap(a[pos], a[father]);elsebreak;father = pos;}}}bool empty(){return a.empty();}T top(){assert(a.size());return a[0];}private:contaier a;conpart _pf;};template<class T>class upsortjust{public:bool operator()(const T& a, const T& b){return a > b;}};template<class T>class downsortjust{public:bool operator()(const T& a, const T& b){return a < b;}};};
小总结

可以看出,仿函数的使用和函数指针的使用是相似的,如果碰见仿函数对象传递的变量
例如:
在这里插入图片描述
sort函数的Compart comp 这个参数,也可以传函数指针,
如果不懂的话,也可以看我模拟的方法,

相关文章:

c++初阶-----适配器---priority_queue

作者前言 &#x1f382; ✨✨✨✨✨✨&#x1f367;&#x1f367;&#x1f367;&#x1f367;&#x1f367;&#x1f367;&#x1f367;&#x1f382; ​&#x1f382; 作者介绍&#xff1a; &#x1f382;&#x1f382; &#x1f382; &#x1f389;&#x1f389;&#x1f389…...

VSCode上安装C#环境教程

本章教程,教你如何在vscode上,可以快速运行一些基础的c#代码。 1、下载 .NET Code SDK 下载地址:https://dotnet.microsoft.com/zh-cn/download/dotnet/sdk-for-vs-code?utm_source=vs-code&utm_medium=referral&utm_campaign=sdk-install 根据自己的操作系统,选择…...

VS Code 和 Visual Studio 哪个更好

文章目录 VS Code 和 Visual Studio 哪个更好Visual Studio Code简介Visual Studio简介相同点差异点总结 VS Code 和 Visual Studio 哪个更好 Visual Studio Code简介 Visual Studio Code&#xff08;简称 VS Code&#xff09;是一款开源的、免费的、跨平台的、轻量级的代码编…...

FCA-数据分析理论试卷

其他参考&#xff1a; https://segmentfault.com/a/1190000043363073 https://blog.csdn.net/CSDN_WYY/article/details/137082340 Part.1&#xff1a;判断题&#xff08;总分&#xff1a;8分 得分&#xff1a;8&#xff09; 第1题 判断题 对任意事件A和B&#xff0c;必有 …...

WPF程序通过CadLib4加载CAD .dwg格式文件

1、下载CadLib相关dll文件&#xff0c;主要用到的&#xff1a;WW.dll、WW.Cad.dll、WW.GL.dll 2、程序中引用dll库。 3、创建WPF程序&#xff0c;使用Canvas来加载dwg文件&#xff0c;支持拖动和放大缩小。 4、部分代码&#xff1a; public void Init(string filename) {tr…...

图表全能王(ChartStudio) 上架VisionPro!

图表全能王(ChartStudio) - 终极图表制作工具&#xff01;支持条形图、折线图、面积图、柱形图、条形图、饼图、玫瑰图、雷达图、牛肉图、风琴图、旭日图、桑基图等图表。 https://apps.apple.com/app/chartstudio-data-analysis/id6474099675 https://apps.apple.com/cn/app/…...

【云原生】Job一次性任务详解

Job一次性任务 文章目录 Job一次性任务一、Job介绍二、运行示例Job 一、Job介绍 Job会创建一个或者多个Pod&#xff0c;并将继续重试Pod的执行&#xff0c;直到指定数量的Pod成功终止。随着Pod成功借宿&#xff0c;Job跟踪记录成功完成的Pod个数。当数量达到指定的成功个数阈值…...

化工厂人员定位采用多种定位技术的融合定位系统的好处

由于化工厂内环境的复杂性和危险性&#xff0c;通常单一的定位技术很难满足全厂区的人员定位需求&#xff0c;如果能将不同定位技术融合在一起&#xff0c;发挥出它们各自的优势&#xff0c;那么就能解决以上问题。 融合定位技术诞生背景 随着科技的不断发展&#xff0c;多种定…...

使用AI绘图工具生成风景图像的教程

随着人工智能技术的飞速发展&#xff0c;AI绘图工具在图像生成和艺术创作方面变得越来越强大&#xff0c;无论你是一个设计师、艺术家&#xff0c;还是仅仅对生成艺术感兴趣的爱好者&#xff0c;AI绘图工具都可以帮助你轻松地创作出惊艳的风景图像。 在这篇教程中&#xff0c;…...

迷你主机:华硕PN65和nuc13pro如何选择?

华硕PN65与NUC 13 Pro&#xff1a;如何做出选择&#xff1f; 在追求高效能与便携性的今天&#xff0c;迷你主机成为了越来越多用户的选择。华硕PN65与英特尔NUC 13 Pro作为市场上两款备受瞩目的产品&#xff0c;各自拥有独特的优势和特点。本文将从处理器性能、扩展性、接口丰…...

分享一个好用的印花重绘工具

本文向大家介绍一款革命性的 AI 工具&#xff0c;它能够将模糊不清的图片转化为具有照片级别的高清图像。这项前沿项目依托于大规模人工智能技术&#xff0c;革新了图像恢复领域。通过文本驱动和智能修复功能&#xff0c;它巧妙地结合了先进的 AI 技术与创新理念&#xff0c;为…...

力扣题解(递增的三元子序列)

334. 递增的三元子序列 给你一个整数数组 nums &#xff0c;判断这个数组中是否存在长度为 3 的递增子序列。 如果存在这样的三元组下标 (i, j, k) 且满足 i < j < k &#xff0c;使得 nums[i] < nums[j] < nums[k] &#xff0c;返回 true &#xff1b;否则&#…...

做不好PPT的原因

新手制作PPT长犯的10个错误 1.Word搬家 为了节约时间&#xff0c;直接把Word素材复制粘贴到PPT上&#xff0c;没有提炼 2.堆积图表 每个页面上堆积了大量的图表&#xff0c;却没有说明数据反映了什么趋势 3.图表业余 想用图表达自己的逻辑&#xff0c;但没有专业的模板&a…...

嵌入式人工智能(45-基于树莓派4B的扩展板-舵机驱动板PCA9685)

1、简介 智能小车、机械臂、摄像头云台会有多个舵机&#xff0c;而微控制器芯片的PWM输出引脚不够的情况下&#xff0c;就可以用PCA9685&#xff08;16路舵机&#xff09;来解决这一问题。 PCA9685是一款I2C总线控制的16通道LED控制器&#xff0c;专为红/绿/蓝/琥珀&#xff…...

【数据结构与算法】建立多个栈的三种方案的优缺点分析

在一个算法中需要建立多个栈时可以选用以下三种方案之一&#xff0c;试问这三方案相比各有什么优缺点&#xff1f; &#xff08;1&#xff09;分别用多个顺序存储空间建立多个独立的顺序栈。 &#xff08;2&#xff09;多个栈共享一个顺序存储空间。 &#xff08;3&#xff09;…...

DjangoRF-14-创建request子应用

注意&#xff0c;本应该是requests模块&#xff0c;为了区分&#xff0c;避免错误&#xff0c;用request 1、进入apps,创建request django-admin startapp request 2、因为只发送请求&#xff0c;没有数据库相关&#xff0c;不需要model。 3、进行序列化 from rest_framework …...

SOMEIP_ETS_005:检查字节序

测试目的&#xff1a; 验证DUT在发送和接收参数时对字节序的处理能力。 描述 本测试用例旨在检验DUT在处理具有不同字节序的参数时&#xff0c;是否能够正确地发送和接收数据&#xff0c;并确保返回的UINT32值是传入的两个参数&#xff08;UINT8和UINT16&#xff09;的和。 …...

为什么要对医疗器械进行网络安全评估?

对医疗器械进行网络安全评估的原因主要有以下几点&#xff1a; 一、保障患者安全 直接关联患者健康&#xff1a;医疗器械与患者的生命健康直接相关&#xff0c;任何网络安全漏洞都可能导致设备被非法控制或数据泄露&#xff0c;进而威胁患者的生命安全。例如&#xff0c;黑客可…...

沃尔玛1P账号的强悍作用重要反映在那些方面?——WAYLI威利跨境助力商家

沃尔玛作为全球最大的零售商之一&#xff0c;其品牌影响力非常强大。商家通过入驻沃尔玛商超并开设1P账号&#xff0c;能够借助沃尔玛的品牌影响力来提升自身的品牌知名度和美誉度。这种品牌背书的效应&#xff0c;有助于商家吸引更多的消费者关注和购买自己的产品。 一、沃尔玛…...

学习python你不能不知道的几个接单平台!实现如月上万不是梦

学Python后&#xff0c;寻找兼职平台是一个很好的实践和提升技能的方式。以下是一些比较推荐的Python兼职平台&#xff1a; 国内平台 程序员客栈 网址&#xff1a;https://www.proginn.com介绍&#xff1a;程序员客栈是中国非常领先的自由工作平台&#xff0c;为中高端程序员、…...

日语AI面试高效通关秘籍:专业解读与青柚面试智能助攻

在如今就业市场竞争日益激烈的背景下&#xff0c;越来越多的求职者将目光投向了日本及中日双语岗位。但是&#xff0c;一场日语面试往往让许多人感到步履维艰。你是否也曾因为面试官抛出的“刁钻问题”而心生畏惧&#xff1f;面对生疏的日语交流环境&#xff0c;即便提前恶补了…...

Spark 之 入门讲解详细版(1)

1、简介 1.1 Spark简介 Spark是加州大学伯克利分校AMP实验室&#xff08;Algorithms, Machines, and People Lab&#xff09;开发通用内存并行计算框架。Spark在2013年6月进入Apache成为孵化项目&#xff0c;8个月后成为Apache顶级项目&#xff0c;速度之快足见过人之处&…...

JVM垃圾回收机制全解析

Java虚拟机&#xff08;JVM&#xff09;中的垃圾收集器&#xff08;Garbage Collector&#xff0c;简称GC&#xff09;是用于自动管理内存的机制。它负责识别和清除不再被程序使用的对象&#xff0c;从而释放内存空间&#xff0c;避免内存泄漏和内存溢出等问题。垃圾收集器在Ja…...

dedecms 织梦自定义表单留言增加ajax验证码功能

增加ajax功能模块&#xff0c;用户不点击提交按钮&#xff0c;只要输入框失去焦点&#xff0c;就会提前提示验证码是否正确。 一&#xff0c;模板上增加验证码 <input name"vdcode"id"vdcode" placeholder"请输入验证码" type"text&quo…...

【快手拥抱开源】通过快手团队开源的 KwaiCoder-AutoThink-preview 解锁大语言模型的潜力

引言&#xff1a; 在人工智能快速发展的浪潮中&#xff0c;快手Kwaipilot团队推出的 KwaiCoder-AutoThink-preview 具有里程碑意义——这是首个公开的AutoThink大语言模型&#xff08;LLM&#xff09;。该模型代表着该领域的重大突破&#xff0c;通过独特方式融合思考与非思考…...

屋顶变身“发电站” ,中天合创屋面分布式光伏发电项目顺利并网!

5月28日&#xff0c;中天合创屋面分布式光伏发电项目顺利并网发电&#xff0c;该项目位于内蒙古自治区鄂尔多斯市乌审旗&#xff0c;项目利用中天合创聚乙烯、聚丙烯仓库屋面作为场地建设光伏电站&#xff0c;总装机容量为9.96MWp。 项目投运后&#xff0c;每年可节约标煤3670…...

2025盘古石杯决赛【手机取证】

前言 第三届盘古石杯国际电子数据取证大赛决赛 最后一题没有解出来&#xff0c;实在找不到&#xff0c;希望有大佬教一下我。 还有就会议时间&#xff0c;我感觉不是图片时间&#xff0c;因为在电脑看到是其他时间用老会议系统开的会。 手机取证 1、分析鸿蒙手机检材&#x…...

Linux C语言网络编程详细入门教程:如何一步步实现TCP服务端与客户端通信

文章目录 Linux C语言网络编程详细入门教程&#xff1a;如何一步步实现TCP服务端与客户端通信前言一、网络通信基础概念二、服务端与客户端的完整流程图解三、每一步的详细讲解和代码示例1. 创建Socket&#xff08;服务端和客户端都要&#xff09;2. 绑定本地地址和端口&#x…...

管理学院权限管理系统开发总结

文章目录 &#x1f393; 管理学院权限管理系统开发总结 - 现代化Web应用实践之路&#x1f4dd; 项目概述&#x1f3d7;️ 技术架构设计后端技术栈前端技术栈 &#x1f4a1; 核心功能特性1. 用户管理模块2. 权限管理系统3. 统计报表功能4. 用户体验优化 &#x1f5c4;️ 数据库设…...

Linux离线(zip方式)安装docker

目录 基础信息操作系统信息docker信息 安装实例安装步骤示例 遇到的问题问题1&#xff1a;修改默认工作路径启动失败问题2 找不到对应组 基础信息 操作系统信息 OS版本&#xff1a;CentOS 7 64位 内核版本&#xff1a;3.10.0 相关命令&#xff1a; uname -rcat /etc/os-rele…...