【STL】priority_queue的使用和模拟实现

priority_queue的使用和介绍

priority_queue的介绍

优先级队列(priority_queue)它也是一个容器适配器,默认使用的容器是vector,在往队列中放入数据时,它会将容器中放置的数据通过堆算法调整成 大堆/小堆,在使用时我们若不指定建堆方法,它默认会是排大堆(less)

它的使用方法其实和stack,queue类似,只是priority_queue在插入元素的基础上进行了调整建堆

priority_queue的定义方式

1.使用priority_queue创建大堆对象:

priority_queue<int, vector<int>, less<int>> q1;

2.使用priority_queue创建小堆对象:

priority_queue<int ,vector<int>, less<int>> q2;

3.不指定容器和底层使用的堆算法

priority_queue<int> q3;

这时它的容器和堆算法默认使用的是vector<int>和less<int>

priority_queue的接口展示:

成员函数功能
push向队尾插入一个元素,并向上调整排序
pop删除堆顶元素(首尾元素交换,删除队尾元素,首元素向下调整)
top访问堆顶元素(队头元素)
size获取队列中有效元素个数
 empty判断队列是否为空
swap交换两个队列的元素

priority_queue的模拟实现

模拟实现:

//仿函数/函数对象
//()运算符重载, 使用方式类似于函数调用,所以可以称为:仿函数
//建大堆
template<class T>
struct Less
{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, class container = vector<T>, class compare = Less<T>>
class priority_queue
{//向上调整, 排大堆void AdjustUp(size_t child){size_t parent = (child - 1) / 2;while (child > 0){if (_com(_con[child], _con[parent])) //使用所给比较方式进行比较{swap(_con[child], _con[parent]);child = parent;parent = (child - 1) / 2;}else{break;}}}//向下调整,排大堆void AdjustDown(size_t parent){compare con; size_t child = parent * 2 + 1;while (child < _con.size()){if (child + 1 < _con.size() && _com(_con[child + 1], _con[child])){++child;}if (_com(_con[child], _con[parent])){swap(_con[parent], _con[child]);parent = child;child = parent * 2 + 1;}else{break;}}}
public:priority_queue(){}template<class inputiterator>priority_queue(inputiterator first, inputiterator last){while (first != last){_con.push_back(*first);++first;}//大堆for (size_t end = (_con.size() - 2) / 2; end >= 0; ++end){AdjustDown(end);}}void push(const T& key){_con.push_back(key);AdjustUp(_con.size() - 1);}void pop(){swap(_con[0], _con[_con.size() - 1]);_con.pop_back();AdjustDown(0);}T& top(){return _con.front();}size_t size(){return _con.size();}bool empty(){return _con.empty();}
private:container _con;compare _com;
};

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

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

相关文章

十七:Spring Boot依赖 (2)-- spring-boot-starter-web 依赖详解

目录 1. spring-boot-starter-web 简介 1.1 作用与功能&#xff1a; 1.2 引入方式&#xff1a; 1.3 包含的核心依赖&#xff1a; 2. 自动配置原理 3. 内嵌 Servlet 容器 3.1 默认 Tomcat 配置&#xff1a; 3.2 替换容器&#xff08;Jetty 或 Undertow&#xff09;&#…

Python注意力机制Attention下CNN-LSTM-ARIMA混合模型预测中国银行股票价格|附数据代码...

全文链接&#xff1a;https://tecdat.cn/?p38195 股票市场在经济发展中占据重要地位。由于股票的高回报特性&#xff0c;股票市场吸引了越来越多机构和投资者的关注。然而&#xff0c;由于股票市场的复杂波动性&#xff0c;有时会给机构或投资者带来巨大损失。考虑到股票市场的…

MySQL中的INT(4)里面的4究竟代表着什么

目录 1. 理解INT类型中的数字2. INT显示宽度与INSERT操作3. SELECT、INSERT、UPDATE、DELETE与显示宽度4. 实际应用中的影响场景5. 创建表时的建议 1. 理解INT类型中的数字 在MySQL中&#xff0c;当你定义一个整数字段为INT(M)&#xff0c;这里的M代表的是显示宽度。 这个数字…

Spring Boot实现的工程认证计算机课程管理解决方案

1系统概述 1.1 研究背景 随着计算机技术的发展以及计算机网络的逐渐普及&#xff0c;互联网成为人们查找信息的重要场所&#xff0c;二十一世纪是信息的时代&#xff0c;所以信息的管理显得特别重要。因此&#xff0c;使用计算机来管理基于工程教育认证的计算机课程管理平台的相…

中药香料价钱快速划价计算器软件 中药文本识别计算费用管理系统操作教程

一、概述 【软件试用版资源文件下载可点文章最后官网卡片了解】 中药香料价钱快速划价计算器软件 中药文本识别计算费用管理系统操作教程 ‌核心功能‌&#xff1a;快速划价与账单管理。 ‌快速划价‌&#xff1a;复制药方文本&#xff0c;点击划价按钮即可计算总金额‌。‌账…

代码随想录刷题记录(二十五)——54. 替换数字

&#xff08;一&#xff09;问题描述 54. 替换数字&#xff08;第八期模拟笔试&#xff09;https://kamacoder.com/problempage.php?pid1064给定一个字符串 s&#xff0c;它包含小写字母和数字字符&#xff0c;请编写一个函数&#xff0c;将字符串中的字母字符保持不变&#…

【温度表达转化】

【温度表达转化】 C语言代码C代码Java代码Python代码 &#x1f490;The Begin&#x1f490;点点关注&#xff0c;收藏不迷路&#x1f490; 利用公式 C5∗(F−32)/9 &#xff08;其中C表示摄氏温度&#xff0c;F表示华氏温度&#xff09; 进行计算转化。 输出 输出一行&#x…

【时间之外】IT人求职和创业应知【32】-RTE二次出现

目录 新闻一&#xff1a;AI-AGENT加速落地&#xff0c;计算机行业利润端好转 新闻二&#xff1a;声网CEO赵斌&#xff1a;RTE将成为生成式AI时代AI Infra的关键部分 新闻三&#xff1a;11月科技盛会&#xff1a;新技术与产品发布一览 认知和思考决定了你的赚钱能力。以下是今…

基于51单片机的温控电风扇proteus仿真

地址&#xff1a;https://pan.baidu.com/s/1vgYgY41tp_axxVFTHAPwFg 提取码&#xff1a;1234 仿真图&#xff1a; 芯片/模块的特点&#xff1a; AT89C52/AT89C51简介&#xff1a; AT89C52/AT89C51是一款经典的8位单片机&#xff0c;是意法半导体&#xff08;STMicroelectron…

Spring 配置绑定原理分析

Spring 配置绑定原理分析 前言 Spring 应用中存在诸多配置&#xff0c;有的是系统配置&#xff0c;有的命令行启动参数配置&#xff0c;有的是yaml配置&#xff0c;有的是分布式配置中心配置&#xff0c;但对使用者而言总是可以通过ConfigurationProperties将它关联到一个Java…

Hadoop生态圈框架部署(五)- Zookeeper完全分布式部署

文章目录 前言一、Zookeeper完全分布式部署&#xff08;手动部署&#xff09;1. 下载Zookeeper2. 上传安装包2. 解压zookeeper安装包3. 配置zookeeper配置文件3.1 创建 zoo.cfg 配置文件3.2 修改 zoo.cfg 配置文件3.3 创建数据持久化目录并创建myid文件 4. 虚拟机hadoop2安装并…

HarmonyOS Next 实战卡片开发 03

HarmonyOS Next 实战卡片开发 03 在前面两张&#xff0c;我们基本掌握了卡片的使用流程&#xff0c;本章节就通过一个实战来加强对卡片使用的理解。 要完成的案例 新建项目和新建服务卡片 设置沉浸式 entry/src/main/ets/entryability/EntryAbility.ets 首页显示轮播图数据 1…

基于 PyTorch 从零手搓一个GPT Transformer 对话大模型

一、从零手实现 GPT Transformer 模型架构 近年来&#xff0c;大模型的发展势头迅猛&#xff0c;成为了人工智能领域的研究热点。大模型以其强大的语言理解和生成能力&#xff0c;在自然语言处理、机器翻译、文本生成等多个领域取得了显著的成果。但这些都离不开其背后的核心架…

三、整数规划

整数规划 建立逻辑变量来整合多个方案。如0-1变量&#xff08;要说明0和1分别表示什么&#xff09;见P79求解纯整数规划的分支定界法&#xff1a; 求解整数规划的松弛问题的最优解若松弛问题的最优解满足整数要求&#xff0c;则得到整数规划的最优解&#xff0c;否则转下一步任…

Docker了解

Docker是一种容器化技术&#xff0c;它可以将应用程序和其依赖项打包到一个独立的、可移植的容器中&#xff0c;以便在不同的环境中运行。Docker基于Linux操作系统的容器化技术&#xff0c;可以提供更轻量、更快速、更灵活、更一致的应用部署和管理方式。 Docker的基本概念包括…

stm32以太网接口:MII和RMII

前言 使用stm32和lwip进行网络通信开发时&#xff0c;实现结构如下&#xff1a; 而MII和RMII就是stm32与PHY芯片之间的通信接口&#xff0c;类似于I2C、UART等。 stm32以太网模块有专用的DMA控制器&#xff0c;通过AHB接口将以太网内核和存储器相连。 数据发送时&#xff0c;…

【GESP】C++一级真题练习(202312)luogu-B3921,小杨的考试

GESP一级真题练习。为2023年12月一级认证真题。逻辑计算问题。 题目题解详见&#xff1a;【GESP】C一级真题练习(202312)luogu-B3921&#xff0c;小杨的考试 | OneCoder 【GESP】C一级真题练习(202312)luogu-B3921&#xff0c;小杨的考试 | OneCoderGESP一级真题练习。为2023…

【java】通过<类与对象> 引入-> 链表

目录 链表 碎片化&#xff1a; 内存碎片产生的原因 如何避免内存碎片&#xff1f; 链表类型 单链表 双链表 单循环链表 双循环链表 java是如何创建链表的&#xff1f; 类与对象 类是什么&#xff1f; 什么是对象&#xff1f; 构建链表 头指针 简画内存图&#…

微软开源5级Agent框架,复杂任务就这么被解决了~

微软又来卷Agent&#xff0c;开源了解决复杂任务的通用Multi-Agent框架Magentic-One&#xff0c;它旨在解决开放性的网络和基于文件的任务&#xff0c;跨越各种领域&#xff0c;如操作网络浏览器、导航本地文件、编写和执行Python代码、做市场调研、写论文等等。 Magentic-One…

矩阵中的路径(dfs)-acwing

题目 23. 矩阵中的路径 - AcWing题库 代码 class Solution { public://以每一个坐标作为dfs起点bool hasPath(vector<vector<char>>& matrix, string str) {for (int i 0; i < matrix.size(); i )for (int j 0; j < matrix[i].size(); j )if (dfs(…