【C++】priority_queue和仿函数

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.hqwc.cn/news/519218.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Mybatis-Plus——05,乐观锁(新注解)

乐观锁&#xff08;新注解&#xff09; 一、数据库添加一个字段二、实体类添加version注解三、注册乐观锁插件四、测试一下4.1成功的乐观锁4.2失败的乐观锁————————创作不易&#xff0c;笔记不易&#xff0c;如觉不错&#xff0c;请三连&#xff0c;谢谢~~ 乐观锁实现方…

哪个品牌骨传导蓝牙耳机好?避免陷阱的终极选购指南

随着智能音频技术的不断进步&#xff0c;蓝牙耳机市场迎来了快速的发展。特别是近年来在运动爱好者中流行的骨传导蓝牙耳机&#xff0c;其以独特的不入耳设计赢得了广泛的欢迎。这种耳机不仅提供了舒适的佩戴体验&#xff0c;还能让用户在享受音乐的同时保持对周围环境的警觉。…

Vue中如何处理组件间的耦合问题?

在Vue中处理组件间的耦合问题是前端开发中常见的挑战之一。耦合问题指的是组件之间的依赖关系过于紧密&#xff0c;一旦某个组件发生改动&#xff0c;则可能导致其它组件也需要作出相应调整。为了解决这个问题&#xff0c;我们可以采取以下几种方法&#xff1a; 使用事件总线&…

Cadence HDL原理图如何备份

首先&#xff0c;在使用Cadence HDL软件时&#xff0c;在绘制完原理图想重新修改的时候&#xff0c;总找不到地方。 请请教完前辈有所了解&#xff0c;故进行记录。&#xff08;防止遗忘&#xff01;共同学习~&#xff09; 第一步&#xff1a; 第二步&#xff1a; 以上。

VisionPro 判断圆是不是无限接近圆或存在缺陷

项目上可能需要判断圆是否是无限接近圆或者判断圆边缘是否存在缺陷等。 第一种方法&#xff1a;找圆工具和点到点的距离计算圆边缘上的点到圆心距离的最大值和最小值的差值。 #region namespace imports using System; using System.Collections; using System.Drawing; usin…

1分钟带你搞定Python函数分类

python语言中&#xff0c;函数可以分为内置函数、自定义函数、有参数函数、无参数函数、有名字函数和匿名函数。其中&#xff0c;内置函数可以直接使用&#xff0c;自定义函数需要根据需求定义。有参数函数在定义时需要指定参数&#xff0c;调用时传入参数。无参数函数在定义时…

通过对话式人工智能打破语言障碍

「AI突破语言障碍」智能人工智能如何让全球交流无障碍 在当今互联的世界中&#xff0c;跨越语言界限进行交流的能力比以往任何时候都更加重要。 对话式人工智能&#xff08;包括聊天机器人和语音助手等技术&#xff09;在打破这些语言障碍方面发挥着关键作用。 在这篇博文中&am…

3.7 day2 Free RTOS

使用ADC采样光敏电阻数值&#xff0c;如何根据这个数值调节LED灯亮度。2.总结DMA空闲中断接收数据的使用方法 while (1){/* USER CODE END WHILE *//* USER CODE BEGIN 3 */adc_value HAL_ADC_GetValue(&hadc);TIM3->CCR3 adc_value * 999 / 4095;printf("%d …

【mogoose】对查询的数据进行过滤不需要展示的信息

数据库结构如下 我只要email userName sex role 几个数据&#xff0c;其余不要 {_id: new ObjectId(65e7b6df8d06a0623fa899f5),email: 12345qq.com,pwd: $2a$10$eLJ9skKEsQxvzHf5X8hbaOXKtg8GCHBeieieSN6Usu17D2DPaI44i,userName: 默认昵称0769,sex: 0,token: {upCount: 0,_…

数学建模【模糊综合评价分析】

一、模糊综合评价分析简介 提到模糊综合评价分析&#xff0c;就先得知道模糊数学。1965年美国控制论学家L.A.Zadeh发表的论文“Fuzzy sets”标志着模糊数学的诞生。 模糊数学又称Fuzzy数学&#xff0c;是研究和处理模糊性现象的一种数学理论和方法。模糊性数学发展的主流是在…

【你也能从零基础学会网站开发】Web建站之HTML+CSS入门篇 常用HTML标签(1)

&#x1f680; 个人主页 极客小俊 ✍&#x1f3fb; 作者简介&#xff1a;web开发者、设计师、技术分享 &#x1f40b; 希望大家多多支持, 我们一起学习和进步&#xff01; &#x1f3c5; 欢迎评论 ❤️点赞&#x1f4ac;评论 &#x1f4c2;收藏 &#x1f4c2;加关注 HTML中的双…

Domain Driven Design (DDD)

Domain Driven Design (DDD领域驱动设计)主要是业务分类例如&#xff08;订单、合同、生产、检测、物流、运输等&#xff09;&#xff0c;独立单元相互不干扰&#xff0c;仅暴露接口的模型。核心在Domain&#xff0c;所有业务模块放这边&#xff0c;当然我们做的时候微服务是一…