【C++】仿函数(less)

C++中的仿函数

class Solution {
public:struct cmp{bool operator()(const pair<string,int>&kv1,const pair<string,int>&kv2){if(kv1.second<kv2.second) return true;if(kv1.second==kv2.second&&kv1.first>kv2.first) return true;return false;}};vector<string> topKFrequent(vector<string>& words, int k) {map<string,int>mp;for(auto& w:words){mp[w]++;}priority_queue<pair<string,int>,vector<pair<string,int>>,cmp>pq(mp.begin(),mp.end());vector<string>res;while(k--){res.push_back(pq.top().first);pq.pop();}return res;}
};

对于以上代码一开始存在一点疑问,为什么自定义一下堆的排序规则还需要定义一个类、结构体然后再在类里面重写operator(),于是我跑去看了一下文档对priority_queue的定义。

嚯,比较器是一个类

这里的value_type是一个模板参数。

可以看到less<>当中没有具体的参数,typename显示的告诉编译器后面是一个类型,这里是告诉编译器,在Container这个类(容器)当中的value_type是一个类型。

less 是一个函数对象(即仿函数)或者函数模板,它不需要具体的变量名来执行比较操作。

<>用于指定类型,好让less的模板参数识别类型。

template <class T>struct less : binary_function <T,T,bool> {bool operator() (const T& x, const T& y) const {return x<y;//升序,小的在前}
};

再来看之前模拟实现的priority_queue代码,真的是边学边忘。

template<class T, class Container = vector<T>,class Compare=std::less<T>>class priority_queue{public:priority_queue(){}template<class InputIterator>priority_queue(InputIterator first, InputIterator last){while (first != last){_con.push_back(*first);first++;}for (int i = (_con.size() - 1 - 1) / 2; i >= 0; i--){Adjust_down(i);}}size_t size(){return _con.size();}void Adjust_up(size_t child){Compare compare;size_t parent = (child - 1) / 2;while (child>0){if (compare(_con[parent],_con[child])){std::swap(_con[parent], _con[child]);child = parent;parent = (child - 1) / 2;}else{break;}}}void Adjust_down(size_t parent){Compare com;size_t child = parent * 2 + 1;while (child < _con.size()){// 选出左右孩子中大的那一个//if (child+1 < _con.size() && _con[child+1] > _con[child])//if (child + 1 < _con.size() && _con[child] < _con[child + 1])if (child + 1 < _con.size() && com(_con[child], _con[child + 1])){++child;}//if (_con[child] > _con[parent])//if (_con[parent] < _con[child])if (com(_con[parent], _con[child])){std::swap(_con[child], _con[parent]);parent = child;child = parent * 2 + 1;}else{break;}}}void push(const T& val){_con.push_back(val);Adjust_up(_con.size()-1);//调堆}void pop(){std::swap(_con[0], _con[_con.size() - 1]);_con.pop_back();Adjust_down(0);}const T& top()const{return _con[0];}bool empty(){return (_con.size() == 0);}bool empty() const {return (_con.size()==0);}private:Container _con;//容器};

将重点抠出来

template<class T, class Container = vector<T>,class Compare=std::less<T>>
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])){std::swap(_con[child], _con[parent]);parent = child;child = parent * 2 + 1;}else{break;}}}
Compare com;//比较器
com(_con[child], _con[child + 1]);//直接调用重载的运算符operator()

就是这样通过重载operator()来改变排序规则的。

总结:less是一个类、通过调用operator()来实现排序规则

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

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

相关文章

TCP/IP详解

目录 一、OSI参考模型 1.图示 2.OSI七层模型各自作用 3.七层通信过程 二、IP协议 1.IPv4首部 2.IPv6首部 三、TCP协议 1.tcp首部格式 2.握手挥手图示 3.握手流程 4.为什么要三次握手&#xff1f; 5.四次挥手流程 6.为什么要四次分手&#xff1f; 7.为什么要等待…

后端Long类型传到前端精度丢失的问题

问题出现&#xff1a;后端的Java Bean的id属性是用的Long类型对应数据库主键使用bigint类型&#xff0c;当使用JSON方式传递该数据给前端时&#xff0c;前端接收到的数据末尾会变成0。&#xff08;发生的精度丢失问题&#xff09; 问题原因&#xff1a;Java中的long能表示的范围…

数据排布与跨距对齐

1 数据排布 1.1 数据排布的概念 在深度学习框架中&#xff0c;特征图通常以四维数组的形式呈现&#xff0c;这四个维度分别是&#xff1a;批量大小N&#xff0c;特征图通道数C&#xff0c;特征图高度H&#xff0c;特征图宽度W。数据排布&#xff08;Layout&#xff09;指的就…

http1.0、http1.1 http 2.0

HTTP/1.0是无状态、无连接的应用层协议。 无连接 无连接&#xff1a;每次请求都要建立连接&#xff0c;需要使用 keep-alive 参数建立长连接、HTTP1.1默认长连接keep-alive   无法复用连接&#xff0c;每次发送请求都要进行TCP连接&#xff0c;TCP的连接释放都比较费事&…

【优选算法题练习】day6

文章目录 一、76. 最小覆盖子串1.题目简介2.解题思路3.代码4.运行结果 二、704. 二分查找1.题目简介2.解题思路3.代码4.运行结果 三、34. 在排序数组中查找元素的第一个和最后一个位置1.题目简介2.解题思路3.代码4.运行结果 总结 一、76. 最小覆盖子串 1.题目简介 76. 最小覆…

魔术之舞:用Python编织无懈可击的WebUI自动化测试奇迹

文末附有精心准备的WebUI自动化测试30道面试题链接~ 一、引言 A. 引入WebUI自动化测试的重要性和挑战 Web应用程序的快速发展和普及使得Web用户界面&#xff08;WebUI&#xff09;自动化测试变得异常重要。随着Web应用程序的复杂性和功能需求的增加&#xff0c;传统的手动测试…

2023秋招,网络安全面试题

Hello&#xff0c;各位小伙伴&#xff0c;我作为一名网络安全工程师曾经在秋招中斩获&#x1f51f;个offer&#x1f33c;&#xff0c;并在国内知名互联网公司任职过的职场老油条&#xff0c;希望可以将我的面试的网络安全大厂面试题和好运分享给大家~ 转眼2023年秋招已经到了金…

04.MySQL——用户管理

用户管理 用户管理的价值 用户 用户信息 MySQL中的用户&#xff0c;都存储在系统数据库mysql的user表中 use mysql;select host,user,authentication_string from user;host&#xff1a; 表示这个用户可以从哪个主机登陆&#xff0c;如果是localhost&#xff0c;表示只能从…

Qt 获得QTableview所选中的行的某一列数据

1、点击QtableView控件-》右键-》跳到槽-》选择 2、编写槽函数信息 void XXX::on_tableView_CalTable_clicked(const QModelIndex &index) {int rowindex.row();//获得当前行索引int colindex.column();//获得当前列索引QModelIndex index1 CalViewModel->index(row,2)…

Enterprise:通过 App search 摄入数据

App Search 是 Elastic Enterprise Search 的一部分&#xff0c;Elastic Enterprise Search 是由 Elasticsearch 提供支持的内容搜索工具集合。 最初由 App Search 引入的一些功能&#xff08;例如网络爬虫&#xff09;现在可以直接通过企业搜索使用。 将这些功能与其他企业搜…

SpringCloud系列:负载均衡组件-Ribbon

作者平台&#xff1a; | CSDN&#xff1a;blog.csdn.net/qq_41153943 | 掘金&#xff1a;juejin.cn/user/651387… | 知乎&#xff1a;www.zhihu.com/people/1024… | GitHub&#xff1a;github.com/JiangXia-10… 本文一共4529字&#xff0c;预计阅读12分钟 前言 前面几…

idea 有时提示找不到类或者符号,日志报java: 找不到符号的解决

解决一&#xff1a; idea maven编译成功&#xff0c;运行失败提示找不到符号&#xff0c;主要是get和set方法找不到符号&#xff0c;此时就是idea的lombok版本冲突 IDEA版本导致的Lombok失效&#xff0c;需要更新lombok版本到1.18.14及之后版本得到解决 <dependency>&…

科技云报道:数字化转型完成后,制造业如何走向“数智”时代?

科技云报道原创。 随着我国数字化转型行动的深入推进和智能制造工程的大力实施&#xff0c;制造业正朝着“数智”时代迈进&#xff0c;生成式AI被视为推动制造业智能化发展的关键驱动力。 据预测&#xff0c;到2027年&#xff0c;将有30%的制造业采用生成式AI来提升产品研发效…

【C++修炼之路】类和对象(下)—— 完结篇

&#x1f451;作者主页&#xff1a;安 度 因 &#x1f3e0;学习社区&#xff1a;StackFrame &#x1f4d6;专栏链接&#xff1a;C修炼之路 文章目录 一、再谈构造函数1、初始化列表2、explicit 关键字 二、static 成员1、概念2、特性 三、友元1、友元函数2、友元类 四、内部类五…

zabbix监控linux主机、监控windows10主机

目录 一、环境准备 1、关闭防火墙 2、准备三台服务器、添加主机声明 3、修改主机名 4、此篇接着上一篇zabbix监控自己的环境下操作&#xff0c;server&#xff08;192.168.147.135&#xff09;已经配置好 二、源码安装zabbix 1、下载包、安装依赖包、联网同步清华时间 2…

十分钟让你了解 Linux ABI

getline() 提供了一种更灵活的方法&#xff0c;可以在不破坏系统的情况下将用户数据读入程序。 在 C 语言中读取字符串是一件非常危险的事情。当读取用户输入时&#xff0c;程序员可能会尝试使用 C 标准库中的 gets 函数。它的用法非常简单&#xff1a; char *gets(char *stri…

Kubernetes对象深入学习之三:对象属性

欢迎访问我的GitHub 这里分类和汇总了欣宸的全部原创(含配套源码)&#xff1a;https://github.com/zq2599/blog_demos 本篇概览 本文是《Kubernetes对象深入学习》系列的第三篇&#xff0c;主要内容是关于对象属性的知识点&#xff0c;关于对象属性&#xff0c;先通过一个具体…

LeetCode·每日一题·1851. 包含每个查询的最小区间·优先队列(小顶堆)

题目 示例 思路 离线查询&#xff1a; 输入的结果数组queries[]是无序的。如果我们按照输入的queries[]本身的顺序逐个查看&#xff0c;时间复杂度会比较高。 于是&#xff0c;我们将queries[]数组按照数值大小&#xff0c;由小到大逐个查询&#xff0c;这种方法称之为离线查询…

Ceph 服务的运用

目录 一、资源池 pool 管理 1.创建一个 Pool 资源池 2.查看集群 Pool 信息 3.查看资源池副本的数量 4.查看 PG 和 PGP 数量 5.修改 pg_num 和 pgp_num 的数量为 128 6.修改 Pool 副本数量为 2 7.修改默认副本数为 2 8.删除 Pool 资源池 8.1修改配置文件 8.2推送 ceph…

TypeScript 1 - 小记

文章目录 关于 TypeScript 关于 TypeScript TypeScript is a superset of JavaScript that compiles to clean JavaScript output. 官网&#xff1a;https://www.typescriptlang.orggithub : https://github.com/microsoft/TypeScriptplayground : https://www.typescriptlan…