【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.mzph.cn/news/727643.shtml

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

相关文章

Vue-03

Vue指令 v-bind 作用&#xff1a;动态设置html的标签属性&#xff08;src url title…&#xff09; 语法&#xff1a;v-bind:属性名"表达式" 举例代码如下&#xff1a; 实现效果如下&#xff1a; 案例&#xff1a;图片切换 实现代码如下&#xff1a; 实现的效果…

Redis面试问题纯享版

基础内容 1、简单介绍以下你了解的Redis 2、对比一下Redis和Memcache的异同&#xff1f; 3、为什么MySQL选用Redis作为缓存&#xff1f; 4、详细聊聊你对Redis各种数据类型的了解&#xff1f; 5、Redis中五种基本数据类型的底层数据结构是什么样的&#xff1f; Redis线程模型…

好物周刊#43:设计素材下载

https://yuque.com/cunyu1943 村雨遥的好物周刊&#xff0c;记录每周看到的有价值的信息&#xff0c;主要针对计算机领域&#xff0c;每周五发布。 一、项目 1. frp 一个专注于内网穿透的高性能的反向代理应用&#xff0c;支持 TCP、UDP、HTTP、HTTPS 等多种协议&#xff0c…

大华IPC网络摄像机如何保存视频

一、背景 通常网络相机&#xff08;IPC&#xff09;不会自带存储功能&#xff0c;需要接入录像机&#xff08;NVR&#xff09;进行保存。 其中NVR也分软件存储及硬件存储&#xff0c;这里不提&#xff0c;这边单独说FTP存储 二、配置前提 要配置FTP存储需要&#xff1a;①网络…

【python进阶篇】面向对象编程(1)

面向对象编程——Object Oriented Programming&#xff0c;简称OOP&#xff0c;是一种程序设计思想。OOP把对象作为程序的基本单元&#xff0c;一个对象包含了数据和操作数据的函数。 在Python中&#xff0c;所有数据类型都可以视为对象&#xff0c;当然也可以自定义对象。自定…

Stable Diffusion 模型分享:DucHaiten-AIart-SDXL(动漫、3D、逼真)

本文收录于《AI绘画从入门到精通》专栏&#xff0c;专栏总目录&#xff1a;点这里。 文章目录 模型介绍生成案例案例一案例二案例三案例四案例五案例六案例七案例八 下载地址 模型介绍 这是一个丰富多彩的 SDXL 模型&#xff0c;可以绘制动漫、3D、科幻、真实等类型的图片。 …

【开源物联网平台】FastBee认证方式和MQTT主题设计

&#x1f308; 个人主页&#xff1a;帐篷Li &#x1f525; 系列专栏&#xff1a;FastBee物联网开源项目 &#x1f4aa;&#x1f3fb; 专注于简单&#xff0c;易用&#xff0c;可拓展&#xff0c;低成本商业化的AIOT物联网解决方案 目录 一、接入步骤 1.1 设备认证 1.2 设备交…

Unity 动画(旧版-新版)

旧版 旧版-动画组件&#xff1a;Animation 窗口-动画 动画文件后缀: .anim 将制作后的动画拖动到Animation组件上 旧版的操作 using System.Collections; using System.Collections.Generic; using UnityEngine;public class c1 : MonoBehaviour {// Start is called before…

C语言学习--摩尔投票算法

目录 1.引入 2.摩尔投票算法 3.具体步骤 3.1抵消阶段 3.2检验过程 4.代码实现 5.总结 1.引入 今天做题看到一个解题思路真的看不懂&#xff0c;一艘才知道是这个算法。 int majorityElement(int* nums, int numsSize) { int notenums[0]; int count1; for(int i1;i<n…

MES+APS难度地狱级,搞定它就是劫后余生呀。

一、什么是MES和APS MES&#xff08;Manufacturing Execution System&#xff09;和APS&#xff08;Advanced Planning and Scheduling&#xff09;是两种在制造业中常用的软件系统&#xff0c;用于优化生产过程和提高生产效率。 MES是一种用于管理和监控制造过程的系统。它与…

稀碎从零算法笔记Day11-LeetCode:有效的字母异位词

题型&#xff1a;字符串、哈希表、排序 链接&#xff1a;242. 有效的字母异位词 - 力扣&#xff08;LeetCode&#xff09; 来源&#xff1a;LeetCode 题目描述 给定两个字符串 s 和 t &#xff0c;编写一个函数来判断 t 是否是 s 的字母异位词。 注意&#xff1a;若 s 和 …

SAP Parallel Accounting(平行分类账业务)配置及操作手册(超详细的说明和测试)

SAP Parallel Accounting(平行分类账业务)配置及操作手册 1、Overview 为了适应不同的会计准则&#xff0c;SAP在新总账中启用了多分类账&#xff0c;&#xff08;其作用简单来说就是&#xff0c;同时一笔记账&#xff0c;会产生多个账套的凭证。&#xff09;分类账可以对应一…

银行数字化转型导师坚鹏:银行数字化转型案例研究

银行数字化转型案例研究 课程背景&#xff1a; 数字化背景下&#xff0c;很多银行存在以下问题&#xff1a; 不清楚银行科技金融数智化案例&#xff1f; 不清楚银行供应链金融数智化案例&#xff1f; 不清楚银行普惠金融数智化案例&#xff1f; 不清楚银行跨境金融数智…

Eclipse左边project框如何打开?

1、点击Eclipse顶端window 2、点击Show View 3、点击Project Explorer。 如下图&#xff08;图片转自其他博主&#xff09;。

自动化测试之web自动化(Selenium)

&#x1f525; 交流讨论&#xff1a;欢迎加入我们一起学习&#xff01; &#x1f525; 资源分享&#xff1a;耗时200小时精选的「软件测试」资料包 &#x1f525; 教程推荐&#xff1a;火遍全网的《软件测试》教程 &#x1f4e2;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1…

大模型日报|今日必读的6篇大模型论文

1.天津大学提出SheetAgent&#xff1a;通过大模型进行电子表格推理和操作 电子表格操作能显著提高工作效率&#xff0c;已经被广泛用于大多数日常工作中。大型语言模型&#xff08;LLM&#xff09;已被尝试用于电子表格的自动操作&#xff0c;但尚未在存在推理挑战的复杂现实任…

C++:设计包含min 函数的栈

目录 题目 代码实现 输出 题目 定义栈的数据结构&#xff0c;要求添加一个min 函数&#xff0c;能够得到栈的最小元素。 要求函数min、push 以及pop 的时间复杂度都是O(1)。 代码实现 #include <iostream>template<typename T>class stack { public:stack() {…

k倍区间c++

题目 输入样例&#xff1a; 5 2 1 2 3 4 5输出样例&#xff1a; 6 思路 本题默认所有读者已经理解了如何求前缀和。 可以利用双层循环分别枚举左端点和右端点即可枚举完所有区间&#xff0c;而对于每个区间&#xff0c;利用一维前缀和判断它是否是一个k倍区间&#xff0c;是…

GraphQL

从表中查询10条数据 {user_info(_limit: 100) {idname} }根据id查询数据 {user_info(_where: {id: 1727515006802587648}_order_by: {create_time: _desc}_limit: 10) {idname} }外键联表查询(特别注意写法:update_by.id): {speaker_info(update_by.id: {_eq: 1729043650301…

外包干了8天,技术退步明显。。。。。

先说一下自己的情况&#xff0c;本科生&#xff0c;19年通过校招进入杭州某软件公司&#xff0c;干了接近3年的功能测试&#xff0c;今年年初&#xff0c;感觉自己不能够在这样下去了&#xff0c;长时间呆在一个舒适的环境会让一个人堕落!而我已经在一个企业干了四年的功能测试…