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

STL——priority_queue

一、priority_queue介绍及使用

1.priority_queue文档介绍

(1)优先队列是一种容器适配器,根据严格的弱排序标准,它的第一个元素总是它所包含的元素中最大的。

(2)此上下文类似与堆,在堆中可以随时插入元素,并且只能检索最大堆元素(优先队列中位于顶部的元素。

(3)优先队列被实现为容器适配器,容器适配器即将特定容器类封装作为其底层容器,queue提供一组特定的成员函数来访问其元素。元素从特定容器的“尾部”弹出,其称为优先队列的顶部。

(4)底层容器可以是任何标准容器类模板,也可以是其他特定设计的容器类。容器应该可以通过随机访问迭代器访问,并支持以下操作:

①empty:检测容器是否为空;

②size:返回容器中有效元素的个数;

③front:返回容器中第一个元素的引用;

④push_back:在容器尾部插入元素;

⑤pop_back:删除容器尾部元素。

(5)标准容器类vector和deque满足这些需求。默认情况下,如果没有为特定的priority_queue类实例化指定容器类,则使用vector。

(6)需要支持随机访问迭代器,以便始终在内部保持堆结构。容器适配器通过在需要时自动调用算法函数make_heap、push_heap和pop_heap来自动完成此操作。

2.priority_queue的使用

        优先级队列默认使用vector作为其底层存储数据的容器,在vector上又使用堆算法将vector中元素构造成堆的结构,因此priority_queue就是堆。所以遇到需要用到堆的时候,就可以考虑使用priority_queue。

注意:

(1)priority_queue的模板参数列表:

(2)默认情况下,priority_queue内采用的是less比较,构造的是大堆。

(3)若要构造小堆,需要显示的提供比priority_queue第三个参数比较方法为greater(头文件为<functional>)。

(4)存放数据为自定义类型时,less和greater比较方法就不适用了。解决方法:①自己定义比较函数,通过函数指针的方式,将函数类型传递进去;②定义仿函数(函数对象),在类中对()进行重载,这样类对象就可以像函数一样被调用

常用接口介绍:

 二、模拟实现priority_queue

#include <iostream>
#include <vector>
#include <functional>
#include <assert.h>
using namespace std;namespace MyPriority_queue {//默认底层容器采用vector,比较方法为less(建大堆)template<class T, class Container = vector<T>, class Compare = less<T>>class priority_queue {public:priority_queue():_con(){}//区间构造template<class Iterator>priority_queue(Iterator first, Iterator last): _con(first, last){//调整为堆for (int root = (_con.size() - 2) / 2; root >= 0; --root) {//从倒数第一个非叶子节点开始向下调整AdjustDown(root);}}void push(const T& val) {_con.push_back(val);//向上调整AdjustUp(_con.size() - 1);}void pop() {if (empty()) assert(0);//交换堆顶和末尾,出队队尾,对堆顶进行调整swap(_con.front(), _con.back());_con.pop_back();AdjustDown(0);}size_t size() const {return _con.size();}bool empty() {return _con.empty();}const T& top() const {//注意堆顶不能被修改return _con.front();}private:void AdjustDown(size_t parent) {size_t child = parent * 2 + 1;//左孩子size_t size = _con.size();Compare com;//创建比较对象while (child < size) {if (child + 1 < size && com(_con[child], _con[child + 1])) {child += 1;//注意标记的是右孩子,所以上面的比较方法传值时要先传左}//检测双亲节点是否满足堆的特性if (com(_con[parent], _con[child])) {//不满足则交换,比继续向下调整swap(_con[parent], _con[child]);parent = child;child = parent * 2 + 1;}else {return;}}}void AdjustUp(size_t child) {size_t parent = (child - 1) / 2;Compare com;while (child) {if (com(_con[parent], _con[child])) {swap(_con[parent], _con[child]);child = parent;parent = (child - 1) / 2;}else {return;}}}private:Container _con;};
}

相关文章:

STL——priority_queue

一、priority_queue介绍及使用 1.priority_queue文档介绍 &#xff08;1&#xff09;优先队列是一种容器适配器&#xff0c;根据严格的弱排序标准&#xff0c;它的第一个元素总是它所包含的元素中最大的。 &#xff08;2&#xff09;此上下文类似与堆&#xff0c;在堆中可以…...

Springboot集成工作流Activity

介绍 官网&#xff1a;https://www.activiti.org/ 一 、工作流介绍 1.工作流&#xff08;workflow&#xff09; 就是通过计算机对业务流程自动化执行管理&#xff0c;它主要解决的是“使在多个参与这之间按照某种预定义规则自动化进行传递文档、信息或任务的过程&#xff0c…...

2023软件测试工程师涨薪攻略,3年如何达到月薪30K?

1.软件测试如何实现涨薪 首先涨薪并不是从8000涨到9000这种涨薪&#xff0c;而是从8000涨到15K加到25K的涨薪。基本上三年之内就可以实现。 如果我们只是普通的有应届毕业生或者是普通本科那我们就只能从小公司开始慢慢往上走。 有些同学想去做测试&#xff0c;是希望能够日…...

Java面试——Spring Bean相关知识

目录 1.Bean的定义 2.Bean的生命周期 3.BeanFactory及Factory Bean 4.Bean的作用域 5.Bean的线程安全问题 1.Bean的定义 JavaBean是描述Java的软件组件模型。在Java模型中&#xff0c;通过JavaBean可以无限扩充Java程序的功能&#xff0c;通过JavaBean的组合可以快速的生…...

上班在群里摸鱼,逮到一个字节8年测试开发,聊过之后羞愧难当...

老话说的好&#xff0c;这人呐&#xff0c;一旦在某个领域鲜有敌手了&#xff0c;就会闲得某疼。前几天我在上班摸鱼刷群的时候认识了一位字节测试开发大佬&#xff0c;在字节工作了8年&#xff0c;因为本人天赋比较高&#xff0c;平时工作也兢兢业业&#xff0c;现在企业内有一…...

HTTP、WebSocket和Socket.IO

一、HTTP协议 HTTP协议是Hyper Text Transfer Protocol&#xff08;超文本传输协议&#xff09;。HTTP 协议和 TCP/IP 协议族内的其他众多的协议相同&#xff0c; 用于客户端和服务器之间的通信。请求访问文本或图像等资源的一端称为客户端&#xff0c; 而提供资源响应的一端称…...

Fluent Python 笔记 第 11 章 接口:从协议到抽象基类

本章讨论的话题是接口:从鸭子类型的代表特征动态协议&#xff0c;到使接口更明确、能验证实现是否符合规定的抽象基类(Abstract Base Class&#xff0c;ABC)。 11.1 Python 文化中的接口和协议 对 Python 程序员来说&#xff0c;“X 类对象”“X 协 议”和“X 接口”都是一个…...

【Spark分布式内存计算框架——Spark Core】11. Spark 内核调度(下)

8.5 Spark 基本概念 Spark Application运行时&#xff0c;涵盖很多概念&#xff0c;主要如下表格&#xff1a; 官方文档&#xff1a;http://spark.apache.org/docs/2.4.5/cluster-overview.html#glossary Application&#xff1a;指的是用户编写的Spark应用程序/代码&#x…...

Java中的函数

1.String.trim() : 主要有2个用法&#xff1a; 1、就是去掉字符串中前后的空白&#xff1b;这个方法的主要可以使用在判断用户输入的密码之类的。 2、它不仅可以去除空白&#xff0c;还可以去除字符串中的制表符&#xff0c;如 ‘\t’,\n等。 2.Integer.parseInt() : 字符串…...

实验6-霍纳法则及变治技术

目录 1.霍纳法则(Horners rule) 2.堆排序 3.求a的n次幂 1.霍纳法则(Horners rule) 【问题描述】用霍纳法则求一个多项式在一个给定点的值 【输入形式】输入三行,第一行是一个整数n,表示的是多项式的最高次数;第二行多项式的系数组P[0...n](从低到高存储);第三行是…...

IP地址:揭晓安欣警官自证清白的黑科技

《狂飙》这部电视剧&#xff0c;此从播出以来可谓是火爆了&#xff0c;想必大家都是看过的。剧中&#xff0c;主人公“安欣”是一名警察。一直在与犯罪分子做斗争。 莽村的李顺案中&#xff0c;有匿名者这个案件在网上发帖恶意造谣&#xff0c;说安欣是黑恶势力的保护伞&#…...

考研复试机试 | C++

目录1.盛水最多的容器<11>题目代码&#xff1a;2.整数转罗马数字题目&#xff1a;代码&#xff1a;3. 清华大学机试题 abc题目题解4.清华大学机试题 反序数题目描述代码对称平方数题目代码&#xff1a;5. 杭电上机题 叠筐题目&#xff1a;代码pass&#xff1a;关于清华大…...

第四章.误差反向传播法—误差反向传播法实现手写数字识别神经网络

第四章.误差反向传播法 4.3 误差反向传播法实现手写数字识别神经网络 通过像组装乐高积木一样组装第四章中实现的层&#xff0c;来构建神经网络。 1.神经网络学习全貌图 1).前提&#xff1a; 神经网络存在合适的权重和偏置&#xff0c;调整权重和偏置以便拟合训练数据的过程称…...

IB学习者的培养目标有哪些?

IB课程强调要培养年轻人的探究精神&#xff0c;在富有渊博知识的同时&#xff0c;更要勤于思考&#xff0c;敢于思考&#xff0c;尊重和理解跨文化的差异&#xff0c;坚持原则维护公平&#xff0c;让这个世界充满爱与和平&#xff0c;让这个世界变得更加美好。上一次我们为大家…...

C++类基础(十三)

类的继承 ● 通过类的继承&#xff08;派生&#xff09;来引入“是一个”的关系&#xff08; 17.2 — Basic inheritance in C&#xff09; – 通常采用 public 继承&#xff08; struct V.S. class &#xff09; – 注意&#xff1a;继承部分不是类的声明 – 使用基类的指针…...

03 OpenCV图像运算

文章目录1 普通加法1 加号相加2 add函数2 加权相加3 按位运算1 按位与运算2 按位或运算、非运算4 掩膜1 普通加法 1 加号相加 在 OpenCV 中&#xff0c;图像加法可以使用加号运算符&#xff08;&#xff09;来实现。例如&#xff0c;如果要将两幅图像相加&#xff0c;可以使用…...

【C语言学习笔记】:动态库

一、动态库 通过之前静态库那篇文章的介绍。发现静态库更容易使用和理解&#xff0c;也达到了代码复用的目的&#xff0c;那为什么还需要动态库呢&#xff1f; 1、为什么还需要动态库&#xff1f; 为什么需要动态库&#xff0c;其实也是静态库的特点导致。 ▶ 空间浪费是静…...

Zookeeper

zookeeper是一个分布式协调服务。所谓分布式协调主要是来解决分布式系统中多个进程之间的同步限制&#xff0c;防止出现脏读&#xff0c;例如我们常说的分布式锁。 zookeeper中的数据是存储在内存当中的&#xff0c;因此它的效率十分高效。它内部的存储方式十分类似于文件存储…...

wav转mp3,wav转换成mp3教程

很多使用音频文件的小伙伴&#xff0c;总会接触到不同类型的音频格式&#xff0c;根据需求不同需要做相关的处理。比如有人接触到了wav格式的音频&#xff0c;这是windows系统研发的一种标准数字音频文件&#xff0c;是一种占用磁盘体积超级大的音频格式&#xff0c;通常用于录…...

springboot项目配置文件加密

1背景&#xff1a; springboot项目中要求不能采用明文密码&#xff0c;故采用配置文件加密. 目前采用有密码的有redis nacos rabbitmq mysql 这些配置文件 2技术 2.1 redis nacos rabbitmq 配置文件加密 采用加密方式是jasypt 加密 2.1.1 加密步骤 2.1.2 引入maven依赖 …...

React Native 导航系统实战(React Navigation)

导航系统实战&#xff08;React Navigation&#xff09; React Navigation 是 React Native 应用中最常用的导航库之一&#xff0c;它提供了多种导航模式&#xff0c;如堆栈导航&#xff08;Stack Navigator&#xff09;、标签导航&#xff08;Tab Navigator&#xff09;和抽屉…...

Zustand 状态管理库:极简而强大的解决方案

Zustand 是一个轻量级、快速和可扩展的状态管理库&#xff0c;特别适合 React 应用。它以简洁的 API 和高效的性能解决了 Redux 等状态管理方案中的繁琐问题。 核心优势对比 基本使用指南 1. 创建 Store // store.js import create from zustandconst useStore create((set)…...

深入理解JavaScript设计模式之单例模式

目录 什么是单例模式为什么需要单例模式常见应用场景包括 单例模式实现透明单例模式实现不透明单例模式用代理实现单例模式javaScript中的单例模式使用命名空间使用闭包封装私有变量 惰性单例通用的惰性单例 结语 什么是单例模式 单例模式&#xff08;Singleton Pattern&#…...

【Go】3、Go语言进阶与依赖管理

前言 本系列文章参考自稀土掘金上的 【字节内部课】公开课&#xff0c;做自我学习总结整理。 Go语言并发编程 Go语言原生支持并发编程&#xff0c;它的核心机制是 Goroutine 协程、Channel 通道&#xff0c;并基于CSP&#xff08;Communicating Sequential Processes&#xff0…...

python报错No module named ‘tensorflow.keras‘

是由于不同版本的tensorflow下的keras所在的路径不同&#xff0c;结合所安装的tensorflow的目录结构修改from语句即可。 原语句&#xff1a; from tensorflow.keras.layers import Conv1D, MaxPooling1D, LSTM, Dense 修改后&#xff1a; from tensorflow.python.keras.lay…...

无人机侦测与反制技术的进展与应用

国家电网无人机侦测与反制技术的进展与应用 引言 随着无人机&#xff08;无人驾驶飞行器&#xff0c;UAV&#xff09;技术的快速发展&#xff0c;其在商业、娱乐和军事领域的广泛应用带来了新的安全挑战。特别是对于关键基础设施如电力系统&#xff0c;无人机的“黑飞”&…...

【C++特殊工具与技术】优化内存分配(一):C++中的内存分配

目录 一、C 内存的基本概念​ 1.1 内存的物理与逻辑结构​ 1.2 C 程序的内存区域划分​ 二、栈内存分配​ 2.1 栈内存的特点​ 2.2 栈内存分配示例​ 三、堆内存分配​ 3.1 new和delete操作符​ 4.2 内存泄漏与悬空指针问题​ 4.3 new和delete的重载​ 四、智能指针…...

抽象类和接口(全)

一、抽象类 1.概念&#xff1a;如果⼀个类中没有包含⾜够的信息来描绘⼀个具体的对象&#xff0c;这样的类就是抽象类。 像是没有实际⼯作的⽅法,我们可以把它设计成⼀个抽象⽅法&#xff0c;包含抽象⽅法的类我们称为抽象类。 2.语法 在Java中&#xff0c;⼀个类如果被 abs…...

前端开发者常用网站

Can I use网站&#xff1a;一个查询网页技术兼容性的网站 一个查询网页技术兼容性的网站Can I use&#xff1a;Can I use... Support tables for HTML5, CSS3, etc (查询浏览器对HTML5的支持情况) 权威网站&#xff1a;MDN JavaScript权威网站&#xff1a;JavaScript | MDN...

React从基础入门到高级实战:React 实战项目 - 项目五:微前端与模块化架构

React 实战项目&#xff1a;微前端与模块化架构 欢迎来到 React 开发教程专栏 的第 30 篇&#xff01;在前 29 篇文章中&#xff0c;我们从 React 的基础概念逐步深入到高级技巧&#xff0c;涵盖了组件设计、状态管理、路由配置、性能优化和企业级应用等核心内容。这一次&…...