【C++】priority_queue和仿函数

news2024/10/24 6:27:37

priority_queue翻译过来就是优先队列,其实就是我们数据结构中的。堆这个东西之前也说过,它分为大根堆和小根堆它的底层是一个类似数组的连续的空间,逻辑结构是一个完全二叉树,这个完全二叉树如果是小根堆的话父亲小于孩子。两兄弟之间没有关系,两个比较关键的操作就是向上调整和向下调整,在建堆和出数据的时候很关键。

下面我们来复习一下向上调整和向下调整

void adjustup(int* a, int n) {
	for (int i = 1; i < n; i++) {
		int j = i;
		int parent = (j - 1) / 2;
		while (parent >= 0) {
			if (a[j] < a[parent]) {
				swap(a[j], a[parent]);
			}
			else break;
			j = parent;
			parent = (j - 1) / 2;
		}
	}
}

void adjustdown(int* a, int n, int pos) {
	int child = pos * 2 + 1;
	while (child < n) {
		if (child + 1 < n && a[child] > a[child + 1])child++;
		if (a[child] < a[pos])swap(a[child], a[pos]);
		else break;
		pos = child;
		child = child * 2 + 1;
	}
}

这就是我们之前学的,我们要排升序要建大堆,排降序要建小堆,那我们来看看C++库里是怎么弄的

这也是一个容器适配器,容器的缺省值用的vector,因为这种结构建起堆来是比较容易的,这跟我们原来学的用数组也是一样的道理,第三个模板参数是一个用来比较的模板参数,这个参数是一个类,缺省值是用的less,默认是建大堆。文档中也有介绍

我们要是想建小堆则要改变第三个模板参数,而它是一个类,所以我们要传一个类进去,就是我们上边的greater<int>,我们要传第三个就要传第二个,这是缺省值的语法规则限制的:给缺省值要从右向左依次给,传参数时从左向右依次匹配。

我么说了,第三个模板参数传了一个类,一个类怎么实现一个比较函数的功能呢?(我们之前不就是传一个函数指针,比如qsort,用回调函数)

因为一个类它并不是函数,所以叫仿函数,或者叫函数对象(它是一个类实例化的一个对象,有函数的功能),我们也可以随随便便写一个仿函数

所以它的关键就是重载了括号,使它的对象可以用括号这个操作符,从而就像函数一样,我们下边模拟实现的时候建大堆还是小堆都是跟库中一样通过传一个类来实现的

下面是一个找数组中最大的第k个数的问题,用C++写就方便了很多

class Solution {
public:
    int findKthLargest(vector<int>& nums, int k) {
        priority_queue<int, vector<int>, greater<int>> pq(nums.begin(),nums.begin() + k);
        auto it = nums.begin() + k;
        while (it != nums.end()) {
            if (*it > pq.top()) {
                pq.pop();
                pq.push(*it);
            }
            it++;
        }
        return pq.top();
    }
};

用法讲完了,下面我们来模拟实现一下

namespace jxh {
	template<class T, class container = vector<T>, class compare = less<T>>
	class priority_queue {
	public:
		void adjustup(int child) {
			compare com;
			int parent = (child - 1) / 2;
			while (parent >= 0) {
				if (com(_con[child] , _con[parent])) {
					std::swap(_con[child], _con[parent]);
				}
				else break;
				child = parent;
				parent = (child - 1) / 2;
			}
		}
		void adjustdown(int parent) {
			compare com;
			int n = _con.size();
			int child = parent * 2 + 1;
			while (child < n) {
				if (child + 1 < n &&  com(_con[child + 1], _con[child]))child++;
				if (com(_con[child] , _con[parent]))std::swap(_con[child], _con[parent]);
				else break;
				parent = child;
				child = child * 2 + 1;
			}
		}
		void push(const T& x) {
			_con.push_back(x);
			adjustup(_con.size() - 1);
		}
		void pop() {
			std::swap(_con[0], _con[_con.size() - 1]);
			_con.pop_back();
			adjustdown(0);
		}
		const T& top() {
			return _con[0];
		}
		bool empty() {
			return _con.empty();
		}
		size_t size() {
			return _con.size();
		}

	private:
		container _con;
	};
}

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

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

相关文章

Python语言基础与应用-北京大学-陈斌-P32-31-计算和控制流-上机练习:创建并调用函数-字符集合的并集-上机代码

Python语言基础与应用-北京大学-陈斌-P32-31-计算和控制流-上机练习&#xff1a;创建并调用函数-字符集合的并集-上机代码 本文环境&#xff1a; win10 Thonny4.1.4 # 函数训练字符集合的并集 def my_union(str1,str2):list1 []list2 []i 0 while i < len(str1):lis…

相机标定实验

相机标定 文章目录 相机标定1 ROS标定1.1安装标定程序1.2 下载标定板1.3 标定1.4 标定结果 2 Kalibr相机标定2.1 下载官方提供的标定板2.2 自定义标定板2.3 cam数据录制2.4 标定2.5 输出结果 3 MATLAB标定3.1 打开工具3.2 添加标定板图片3.3 设置标定参数3.4 生成标定结果3.5 标…

数字政府建设中的锐捷力量:五维构建坚实的数字政务基础设施

3月1日,中国信息协会部分地方信息机构负责人会议暨信息服务业助力高质量发展研讨会在深圳成功召开。来自民政部、农业农村部、国家统计局、人民日报社等部委单位,全国省市信息协会、信息中心、大数据局负责人,信息化领域专家学者在内的230多名代表参加了会议。2024年是立足“二…

【网络原理】初识网络原理

目录 &#x1f384;网络发展史&#x1f338;独立模式&#x1f338;网络互连&#x1f33b;局域网LAN&#x1f33c;基于网线直连&#x1f33c;基于集线器组建&#x1f33c;基于交换机组建&#x1f33c;基于交换机和路由器组建 &#x1f33b;广域网WAN &#x1f333;网络通信基础&…

Java定时调度

在Java应用程序中&#xff0c;定时调度是一项重要的任务。它允许你安排代码执行的时间&#xff0c;以便在将来的某个时刻自动执行任务。Java提供了多种方式来实现定时调度&#xff0c;其中最常用的是Java的Timer和ScheduledExecutorService。 在本教程中&#xff0c;我们将学习…

【Java项目介绍和界面搭建】拼图小游戏——作弊码、查看完整图片

&#x1f36c; 博主介绍&#x1f468;‍&#x1f393; 博主介绍&#xff1a;大家好&#xff0c;我是 hacker-routing &#xff0c;很高兴认识大家~ ✨主攻领域&#xff1a;【渗透领域】【应急响应】 【Java】 【VulnHub靶场复现】【面试分析】 &#x1f389;点赞➕评论➕收藏 …

进程之舞:操作系统中的启动、状态转换与唤醒艺术

✨✨ 欢迎大家来访Srlua的博文&#xff08;づ&#xffe3;3&#xffe3;&#xff09;づ╭❤&#xff5e;✨✨ &#x1f31f;&#x1f31f; 欢迎各位亲爱的读者&#xff0c;感谢你们抽出宝贵的时间来阅读我的文章。 我是Srlua&#xff0c;在这里我会分享我的知识和经验。&#x…

fasta文件与fastq文件相互转化Python脚本

fa文件与fq文件互相转换 今天分享的内容是fasta文件与fastq文件的基本知识&#xff0c;以及通过Python实现两者互相转换的方法。 测序数据公司给的格式通常是fq.gz&#xff0c;也就是fastq文件&#xff0c;计算机的角度来说&#xff0c;生物的序列属于一种字符串&#xff0c;就…

嵌入式学习-FreeRTOS-Day2

嵌入式学习-FreeRTOS-Day2 一、思维导图 二、作业 1.使用ADC采样光敏电阻数值&#xff0c;如何根据这个数值调节LED灯亮度。 int main(void) {/* USER CODE BEGIN 1 *//* USER CODE END 1 *//* MCU Configuration--------------------------------------------------------*…

b站小土堆pytorch学习记录—— P25-P26 网络模型的使用和修改、保存和读取

文章目录 一、修改1.方法2.代码 二、保存和读取1.方法2.代码&#xff08;1&#xff09;保存&#xff08;2&#xff09;加载 3.陷阱 一、修改 1.方法 add_module(name: str, module: Module) -> None name 是要添加的子模块的名称。 module 是要添加的子模块。 调用 add_m…

小火星露谷管理器建议的模组安装文件结构

建议的模组安装文件结构 小火星露谷管理器希望用户将所有模组直接解压到Mods这一层目录&#xff0c;而不是嵌套存放。 比如你安装了两个模组&#xff0c;Content Patcher和Custom Companions&#xff0c;你应该直接解压到Mods文件夹中&#xff0c;并保证解压的内容全部在一个…

开放式高实时高性能PLC控制器解决方案-基于米尔电子STM32MP135

前言 随着工业数字化进程加速与IT/OT深入融合&#xff0c;不断增加的OT核心数据已经逐步成为工业自动化行业的核心资产&#xff0c;而OT层数据具备高实时、高精度、冗余度高、数据量大等等特点&#xff0c;如何获取更加精准的OT数据对数字化进程起到至关重要的作用&#xff0c;…

Vue.js+SpringBoot开发天然气工程运维系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 系统角色分类2.2 核心功能2.2.1 流程 12.2.2 流程 22.3 各角色功能2.3.1 系统管理员功能2.3.2 用户服务部功能2.3.3 分公司&#xff08;施工单位&#xff09;功能2.3.3.1 技术员角色功能2.3.3.2 材料员角色功能 2.3.4 安…

中华财险启动“3·15”金融消费者权益保护教育宣传活动!

2024年中国银行保险业“3•15”消费者权益保护教育宣传活动拉开帷幕。中华财险始终坚持“中华保险•服务中华”&#xff0c;切实履行险企责任&#xff0c;为主动保护金融消费者合法权益&#xff0c;在国家监督管理总局和中华保险集团的指导下&#xff0c;全面开展“3•15” 金融…

计算机网络面经-HTTPS加密过程

前言 在上篇文章HTTPS详解一中&#xff0c;我已经为大家介绍了 HTTPS 的详细原理和通信流程&#xff0c;但总感觉少了点什么&#xff0c;应该是少了对安全层的针对性介绍&#xff0c;那么这篇文章就算是对HTTPS 详解一的补充吧。还记得这张图吧。 HTTPS 和 HTTP的区别 显然&am…

什么?!你居然连个内存泄漏都排查不出来

公众号&#xff1a;程序员白特&#xff0c;欢迎一起交流学习~ 在日常的业务开发中&#xff0c;偶尔会出现内存泄漏的情况&#xff0c;那么我们该怎么排查呢&#xff1f;现在跟着文章一起学习下吧~ 使用Chrome devTools查看内存情况 打开Chrome的无痕模式&#xff0c;以屏蔽Ch…

Java引用传递及基本应用

在 Java 中&#xff0c;传递参数的方式主要有两种&#xff1a;值传递&#xff08;传递的是对象的引用值&#xff09;和引用传递。本教程将重点介绍 Java 中的引用传递以及其基本应用。 1. 引用传递概念 在 Java 中&#xff0c;所有的方法参数都是通过值传递的。对于对象类型的…

市场低估了什么?

伍戈认为&#xff0c;市场低估了CPI和PPI的下行压力和政策的定力&#xff0c;一季度实际经济增速或与年度预期目标有些偏离&#xff0c;预计二季度开始逆周期政策逐步加力&#xff0c;从而引致名义GDP的阶段性趋稳过程。 核心观点&#xff1a; 1.时光若倒流&#xff0c;能否预见…

JS使用方式

JS是解释性语言&#xff0c;所以不需要搭建类似C#/Java之类的开发运行环境&#xff0c;因为他们是编译型语言。JS一般运行在浏览器中或者node环境中&#xff0c;这里都是JS引擎的功劳。 node环境使用 推荐使用nvm管理node版本&#xff0c;nrm管理代理地址。 安装node&#xf…

关于Vue3的一些操作

1. 设置浏览器自动打开 在package.json 中设置 dev: vite --open 2.给src文件夹配置别名 在vite.config.ts配置文件中添加以下内容 3. 如果2中有红色波浪线的问题 ***安装一个文件包***npm install types/node3. 在tsconfig.json配置文件中&#xff0c;找到配置项compi…