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

【C++】---优先级队列 仿函数

文章目录

  • 优先级队列介绍
  • 优先级队列使用
  • 仿函数
  • 优先级队列模拟实现

优先级队列介绍

优先队列是一种容器适配器 ,它的底层实现是堆,虽然它的名字里面有队列,但它并没有队列先进先出的特性

image-20230404115534258

优先级队列定义在头文件中,其模板参数有三个,第一个是类型,第二个是结构,第三个则是指定底层实现是使用大堆还是小堆(默认是大堆)

关于第三个参数的实现就要提到一个语法知识–仿函数,下面会讲到。先来看看优先级队列的简单接口操作

优先级队列使用

image-20230404122640002

和之前的容器类似,优先级队列也有插入删除接口,这里要注意优先级队列并没有迭代器,因为如果优先级队列具有随机访问的话会破坏底层的堆结构

int main() {priority_queue<int> qe;qe.push(1);qe.push(3);qe.push(4);qe.push(8);for (int i = 0; i < 4; ++i) {cout << qe.top() << " ";qe.pop();}cout << endl;return 0;
}

image-20230404123022349

可以看到如果我们定义一个优先级队列并且指定的模板参数只有第一个类型时,其默认的方式是大堆,因此当我们逐个取出数据时,无论插入数据的顺序如何都会在内部自动以大堆的形式排序好。

那么如果我们先要让其以小堆的形式存储呢。首先因为优先级队列的模板参数里面后面的两个参数都给定了缺省值,所以如果我们需要指定第三个参数时注意也要将第二个参数写上

指定大堆或小堆的头文件– 默认是大堆 greater是小堆 less是大堆

int main() {priority_queue<int, vector<int>, greater<int>> qe;qe.push(1);qe.push(3);qe.push(4);qe.push(8);for (int i = 0; i < 4; ++i) {cout << qe.top() << " ";qe.pop();}cout << endl;return 0;
}

image-20230404123627229

以上就是优先级队列的简单使用,下面来一道OJ题练习一下,

数组中第k大元素

image-20230404123903357

这道题要求找出一个数组中的第k大个元素,如果在之前没有了解过优先级队列,那我们就得对数组进行排序比较的麻烦,现在有了优先级队列我们就可以直接将数组中的每个元素插入到优先级队列中,然后将第k个元素前的元素pop掉之后取出顶部的元素即可

class Solution {
public:int findKthLargest(vector<int>& nums, int k) {//优先级队列区间构造priority_queue<int> qe(nums.begin(), nums.end());while (--k)qe.pop();return qe.top();}
};

仿函数

了解完优先级队列的简单使用,现在我们来看一下一个新的语法知识,仿函数。先来看一段代码

//仿函数
template<class T>
class myless {
public:bool operator()(const T& x, const T& y) {return x > y;}
};template<class T>
class mygreater {
public:bool operator()(const T& x, const T& y) {return x < y;}
};

上面的代码定义了两个类,类中重载了()运算符

myless<int> lessfunc;
cout << lessfunc(1, 2) << endl;
mygreater<int> greaterfunc;
cout << greaterfunc(1, 2) << endl;

乍一看上面的 lessfunc(1, 2),greaterfunc(1, 2) 可能会觉得像是在调用一个函数,实际上不是,这只是这两个类的实例化对象因为类重载了()操作符,所以用起来就跟函数一样,这样的类对象就可以称为仿函数。

优先级队列模拟实现

了解了仿函数,接下来就可以进行优先级队列的模拟实现了。

首先实现一个容器类,肯定得先定义好类的构造函数。因为优先级队列的底层是堆,所以我们肯定需要对元素进行建堆操作,那么建堆有两种方式–向上调整和向下调整,关于这两种方法可以参考之前关于堆的那篇文章。

因为我们需要做到根据模板参数不同而灵活做出大堆小堆的切换,所以建堆的方法中我们加入仿函数去进行比较这样才能实现对模式的切换

对于插入操作,每插入一个元素都得进行堆调整以保证堆结构不被破坏,因为元素插入是尾插,所以选用向上调整

对于删除操作,删除元素后也不能破坏堆结构,因为是删除数组顶部元素,所以选用向下调整法

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:priority_queue(){}//区间构造函数template<class InputIterator>priority_queue(InputIterator first, InputIterator last):_con(first, last){//建堆for (int i = (_con.size() - 1 - 1) / 2; i >= 0; ++i)adjust_down(i);}//向上调整void adjust_up(size_t child) {//创建仿函数对象Compare com;size_t parent = (child - 1) / 2;while (child > 0) {//比较父与子元素,实现堆结构if (com(_con[parent], _con[child])) {swap(_con[child], _con[parent]);child = parent;parent = (child - 1) / 2;}elsebreak;}}//向下调整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;}elsebreak;}}void push(const T& x) {_con.push_back(x);adjust_up(_con.size() - 1);}void pop() {//交换首尾元素,删除原首元素swap(_con[0], _con[_con.size() - 1]);_con.pop_back();adjust_down(0);}const T& top() const{return _con[0];}bool empty() const {return _con.empty();}private://元素数组Container _con;
};

相关文章:

【C++】---优先级队列 仿函数

文章目录优先级队列介绍优先级队列使用仿函数优先级队列模拟实现优先级队列介绍 优先队列是一种容器适配器 &#xff0c;它的底层实现是堆&#xff0c;虽然它的名字里面有队列&#xff0c;但它并没有队列先进先出的特性 优先级队列定义在头文件中&#xff0c;其模板参数有三个…...

图的遍历算法

图的遍历1.连通图的深度优先搜索1.1. 递归1.2.非递归2.连通图的广度优先遍历3. 非连通图的深度&#xff08;广度&#xff09;优先遍历1.连通图的深度优先搜索 算法思想&#xff1a;从图中某个顶点vi出发&#xff0c;访问此顶点&#xff0c;然后依次从v1的各个未被访问的邻接点…...

【蓝桥杯集训·每日一题】 AcWing 3996. 涂色

文章目录一、题目1、原题链接2、题目描述二、解题报告1、思路分析2、时间复杂度3、代码详解三、知识风暴区间DPUnique函数一、题目 1、原题链接 3996. 涂色 2、题目描述 有 n 个砖块排成一排&#xff0c;从左到右编号为 1∼n。 其中&#xff0c;第 i 个砖块的初始颜色为 ci。 …...

人工智能中的Web端编程

Java是当前的主流编程语言之一&#xff0c;常年稳居TIOBE编程语言排行榜前五。Java的使用领域非常广泛&#xff0c;包括了桌面端编程、Web端编程、移动端编程等几乎所有的编程领域。Java是Web端编程使用最广泛的编程语言之一。要学习Web端编程&#xff0c;需要了解Java语言的知…...

jsp+mysql+J2EE校园自行车租赁系统cdA1A2程序

本系统的具体功能有以下六项&#xff1a; 1、用户信息管理模块&#xff1a;用户需要注册成为本网站的用户&#xff0c;同时修改自己的用户资料&#xff0c;在必要时修改自己的登陆密码。 2、车辆查询模块:用户可以根据自己的要求&#xff0c;按照不同的查询方式来查询自己想要的…...

当营养遇上肠道菌群:探究其对儿童健康的影响

谷禾健康 越来越多的证据表明&#xff0c;肠道菌群定植紊乱和微生物多样性减少与全球非传染性疾病 (NCD) 的增加有关。影响儿童和青少年的非传染性疾病包括肥胖及其相关合并症、自身免疫性疾病、过敏性疾病和哮喘。饮食变化也与非传染性疾病的发病机制有关&#xff0c;并且由于…...

vue尚品汇商城项目-day01【4.完成非路由组件Header与Footer业务】

文章目录4.完成非路由组件Header与Footer业务4.1使用组件的步骤&#xff08;非路由组件&#xff09;本人其他相关文章链接4.完成非路由组件Header与Footer业务 在咱们项目开发中&#xff0c;不在以HTML CSS 为主&#xff0c;主要搞业务、逻辑 开发项目的流程&#xff1a; (1)…...

IDEA安装教程(图文详解,一步搞定)

文章目录第一步&#xff1a;官网下载IDEA第二步&#xff1a;卸载旧的IDEA&#xff08;没有则跳过&#xff09;第二步&#xff1a;安装IDEA第一步&#xff1a;官网下载IDEA 地址&#xff1a;https://www.jetbrains.com/idea/download/other.html 第二步&#xff1a;卸载旧的I…...

【01 DualCam Porting】

1、配置camera_custom_stero_setting.h a、增加sensor配置 /vendor/mediatek/proprietary/custom/mt6765/hal/camera/camera_custom_stereo_setting.h注意: 1)IMGOYUV Size:在有FOV crop的情况下,不能配置为sensor full size,建议比full size 小或者配置为fov crop的值…...

redis --- string类型的使用

目录 一、string类型使用 1.1、set key value参数解析 1.2、同时设置/获取多个键值 1.3、获取/设置指定区间范围内的值 1.4、数值增减 1.5、获取字符串长度和内容追加 1.6、分布式锁 1.7、getset(先get再set) 一、string类型使用 1.1、set key value参数解析 SET key v…...

康耐视visionpro-机器视觉定位引导-经验总结-来自视觉人粉丝分享

1、机器人吸取电路板&#xff0c;移动到拍照位置&#xff0c;并在电路板上找一个标记点&#xff0c;并且&#xff0c;通过机器人示教把当前电路板能够准确的放入到目标位置。 2、机器人吸取电路板吸取电路板&#xff0c;在x,y方向进行移动&#xff0c;总共移动4个位置&#xff…...

包管理工具npm

一&#xff1a;package.json 在某个文件路径下&#xff0c;执行 npm init。就会生成package.json文件。大致如下&#xff1a; {"name": "test","version": "1.0.0","description": "测试","main": &q…...

ChatGPT正进军各行各业,抓住机遇,拥有无限的可能性。

每一个新技术的出现都会对各行各业产生冲击&#xff0c;但关键在于如何抓住这个机遇。ChatGPT是一项非常具有前途的技术&#xff0c;它可以在许多领域为人们提供更好的服务和体验。这项技术的优势之一是它可以快速而准确地理解和解释自然语言&#xff0c;从而使人们可以更轻松地…...

Maven 多模块管理

多模块管理简单地理解就是一个 Java 工程项目中不止有一个 pom.xml 文件&#xff0c;会在不同的目录中有多个这样的文件&#xff0c;进而实现 Maven 的多模块管理 在多人使用Maven协作开发项目时&#xff0c;尤其是稍微上点规模的项目&#xff0c;每个RD的工作都细分到具体功能…...

crash 内核调试工具 ps 指令 显示的进程状态 RU, IN, UN, ZO, ST, TR, DE, SW, WA, PA 什么意思

crash> help ps | grep "the task state" 5. the task state (RU, IN, UN, ZO ,ST, TR, DE, SW, WA, PA, ID, NE) 参考linux-4.19.113内核源码&#xff08;include/linux/sched.h&#xff09;&#xff0c;有如下定义 /** Task state bitmask. NOTE! These bits…...

Spring《二》bean的实例化与生命周期

&#x1f34e;道阻且长&#xff0c;行则将至。&#x1f353; 上一篇&#xff1a;Spring《一》快速入门 下一篇&#xff1a;Spring《三》DI依赖注入 目录一、bean实例化&#x1f34d;1.构造方法 ***2.静态工厂 *使用工厂创建对象实例化bean3.实例工厂 ***使用示例工厂创建对象实…...

java与kotlin 写法区别

原文链接&#xff1a;https://gitcode.net/mirrors/mindorksopensource/from-java-to-kotlin?utm_sourcecsdn_github_accelerator#assigning-the-null-value Print to Console 打印到控制台 Java System.out.print("Amit Shekhar"); System.out.println("Amit…...

服务器运行深度学习代码使用指南

该内容配置均在九天毕昇下配置。 当前系统使用的linux版本为&#xff1a;Ubuntu 18.04 LTS。 当前版本安装的是&#xff1a;cuda10.1。 九天毕昇平台&#xff1a;https://jiutian.10086.cn/edu/#/home 一、linux下运行python的操作 ls 为列出当前目录中的文件 cd 文件名 进入…...

计算机组成原理 - 2. 数据的表示和运算

整理自天勤高分笔记&#xff0c;购书链接&#xff1a; 24 天勤高分笔记 要记住的几个数字 &#x1f4d3;&#xff1a; 215327682^{15} 3276821532768 216655362^{16} 6553621665536 23121474836482^{31} 21474836482312147483648 23242949672962^{32} 4294967296232429496…...

【js】基础知识点--语句,break和continue,switch,with,for..in,do-while,while

一、break和continue语句&#xff0c;常用 break 语句会立即退出循环&#xff0c;强制继续执行循环后面的语句。而 continue 语句虽然也是立即退出循环&#xff0c;但退出循环后会从循环的顶部继续执行 var num 0; for (var i1; i < 10; i) {if (i % 5 0) {break;}num; …...

从零实现富文本编辑器#5-编辑器选区模型的状态结构表达

先前我们总结了浏览器选区模型的交互策略&#xff0c;并且实现了基本的选区操作&#xff0c;还调研了自绘选区的实现。那么相对的&#xff0c;我们还需要设计编辑器的选区表达&#xff0c;也可以称为模型选区。编辑器中应用变更时的操作范围&#xff0c;就是以模型选区为基准来…...

centos 7 部署awstats 网站访问检测

一、基础环境准备&#xff08;两种安装方式都要做&#xff09; bash # 安装必要依赖 yum install -y httpd perl mod_perl perl-Time-HiRes perl-DateTime systemctl enable httpd # 设置 Apache 开机自启 systemctl start httpd # 启动 Apache二、安装 AWStats&#xff0…...

基于uniapp+WebSocket实现聊天对话、消息监听、消息推送、聊天室等功能,多端兼容

基于 ​UniApp + WebSocket​实现多端兼容的实时通讯系统,涵盖WebSocket连接建立、消息收发机制、多端兼容性配置、消息实时监听等功能,适配​微信小程序、H5、Android、iOS等终端 目录 技术选型分析WebSocket协议优势UniApp跨平台特性WebSocket 基础实现连接管理消息收发连接…...

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

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

第一篇:Agent2Agent (A2A) 协议——协作式人工智能的黎明

AI 领域的快速发展正在催生一个新时代&#xff0c;智能代理&#xff08;agents&#xff09;不再是孤立的个体&#xff0c;而是能够像一个数字团队一样协作。然而&#xff0c;当前 AI 生态系统的碎片化阻碍了这一愿景的实现&#xff0c;导致了“AI 巴别塔问题”——不同代理之间…...

Neo4j 集群管理:原理、技术与最佳实践深度解析

Neo4j 的集群技术是其企业级高可用性、可扩展性和容错能力的核心。通过深入分析官方文档,本文将系统阐述其集群管理的核心原理、关键技术、实用技巧和行业最佳实践。 Neo4j 的 Causal Clustering 架构提供了一个强大而灵活的基石,用于构建高可用、可扩展且一致的图数据库服务…...

【生成模型】视频生成论文调研

工作清单 上游应用方向&#xff1a;控制、速度、时长、高动态、多主体驱动 类型工作基础模型WAN / WAN-VACE / HunyuanVideo控制条件轨迹控制ATI~镜头控制ReCamMaster~多主体驱动Phantom~音频驱动Let Them Talk: Audio-Driven Multi-Person Conversational Video Generation速…...

回溯算法学习

一、电话号码的字母组合 import java.util.ArrayList; import java.util.List;import javax.management.loading.PrivateClassLoader;public class letterCombinations {private static final String[] KEYPAD {"", //0"", //1"abc", //2"…...

纯 Java 项目(非 SpringBoot)集成 Mybatis-Plus 和 Mybatis-Plus-Join

纯 Java 项目&#xff08;非 SpringBoot&#xff09;集成 Mybatis-Plus 和 Mybatis-Plus-Join 1、依赖1.1、依赖版本1.2、pom.xml 2、代码2.1、SqlSession 构造器2.2、MybatisPlus代码生成器2.3、获取 config.yml 配置2.3.1、config.yml2.3.2、项目配置类 2.4、ftl 模板2.4.1、…...

从面试角度回答Android中ContentProvider启动原理

Android中ContentProvider原理的面试角度解析&#xff0c;分为​​已启动​​和​​未启动​​两种场景&#xff1a; 一、ContentProvider已启动的情况 1. ​​核心流程​​ ​​触发条件​​&#xff1a;当其他组件&#xff08;如Activity、Service&#xff09;通过ContentR…...