C++ 仿函数

目录

1、什么是仿函数?

2、仿函数在哪里?

3、如何理解?(很简单很简单)

4、仿函数的价值,应用场景:

1、商品的比较

2、成绩的比较


1、什么是仿函数?


仿函数仿函数,顾名思义就是模仿函数
模仿了函数的什么呢?
模仿了函数的调用形式
例如有一个函数int func(v)
调用的时候是   func(v1)
func(v1)这个就是函数的调用方式


//这就是一个仿函数,是一个类,类内部封装了一个括号操作符重载
template<class T>
class A
{
public:
	bool operator()(const T& x, const T& y)
	{
		return x > y;
	}
};

2、仿函数在哪里?


仿函数在类内部
本质就是一个运算符重载
不过重载的是一个 boo operator(){...}
例如类型A,内部重载了一个运算符:boo operator(){...}
那么,A的对象在调用方式时,其形式为:
1、a1.operator()(操作数);

	A<int> a;
	//调用方式1
	a.operator()(1,2);


2、a1(操作数);

	//调用方式2
	a(1, 2);


3、A()(操作数);

	//如果调用方式3,你看不明白,那下面这个就很好理解了
	//事实上是这样的:匿名对象
	A<int>()         (1, 2);


第二种调用形式是不是和函数的调用方式一样?因此,叫将A叫做仿函数。

3、如何理解?(很简单很简单)


其实就是编译器的一个编译优化的问题

我们可以类比vector的[]运算符重载

1、本来的方括号【】和括号()操作符调用方式

	A<int> a;
	std::vector<int> v;
	
	//1、这是[]方括号操作符本来应该的调用方式
	v.operator[](2);

	//同理,这也是()括号操作符本来应该的调用方式
	a.operator()(1, 2);

2、省略了operator之后的调用方式


	//2、但是编译器进行了优化
	//直接省略了.operator[]
	v[2];
	//同理,也是直接省略了.operator()
	a(1,2);

因此,在省略之后了调用方式上,看起来,就像是一个函数a的调用。

但是事实上不是,a其实是一个类的是实例化对象

这个实例化对象a调用了内部的()重载括号操作符

但是,编译器的优化效果,使得我们可以省略去operator显式调用

于是,在视觉的效果上,就只剩下了a()

所以,看起来像一个函数调用,,因而叫做仿函数

但是,要记住,其底层依旧是a.operator()()

再次重申:

仿函数本质就是一个类

类对象调用a.operator()()被编译器优化省略了

优化成为了a()

看起来像函数

但其实不是函数

所以叫做仿函数

(我觉得,已经讲的足够清楚了,仿函数知道这些就足够了,至于适配器,后面再讲)


4、仿函数的价值,应用场景:


1、商品的比较


默认一个类内部只能实现一个比较逻辑,也就是对单一的变量进行比较
例如比较运算符比较了价格,就不能比较评分、质量等其他标准
所以,就用到了仿函数


2、成绩的比较


比较往往需要的不仅仅是一个结果
例如说,对成绩进行排名,你得知道到底是张三倒数第一,还是李四倒数第一
如果仅仅排出成绩的序列,但是不知道到底是谁的成绩,那么毫无意义
所以,仅仅是对某个数据的比较,然后返回一个单一的结果是不行的
返回值一定是一个自定义类型

我们可以控制返回值来控制上述的返回结果
所以,仿函数又用到了

仿函数的大于是降序,小于是升序;别问,问就是语法规定

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

企业怎样进行IT外包以及IT外包服务内容

在数字化时代的浪潮中&#xff0c;企业逐渐认识到信息技术的关键作用&#xff0c;特别是制造业基地对于IT外包和运维服务的需求持续增长。然而&#xff0c;在诸多可供选择的IT外包和运维方案中&#xff0c;企业如何推动与IT外包公司的合作&#xff1f;本文将深入介绍IT外包方案…

Python解释器3.8.2版本安装详细教程

Python解释器提取链接链接&#xff1a; https://pan.baidu.com/s/1eDvwYmUJ4l7kIBXewtN4EA?pwd1111 提取码&#xff1a;1111 演示版本为3.6.8&#xff0c;链接安装包为3.8.2版&#xff0c;包中附加pytharm安装包。 1.双击提取好的python-exe安装文件&#xff0c;会…

泛型编程四:容器

文章目录 前言一、序列容器verctor 总结 前言 STL有六大部件&#xff0c;容器、算法、仿函数、迭代器、适配器和分配器。除了算法是函数模板&#xff0c;其他都是类模板。容器可以分为序列容器和关联容器。常见的序列容器有vector、array、deque、list、forward-list&#xff…

Ansible——playbook编写

一、简介 1.什么是playbook Ansible Playbook 是设定自动化任务的一种蓝图&#xff0c;可在无需人工干预或有限干预的前提下执行复杂的 IT 操作。Ansible Playbook 对一组或一类共同构成 Ansible 清单的主机执行。 Ansible Playbook 本质上是一些框架&#xff0c;是一些预先编…

C/C++ 入门(10)list类(STL)

个人主页&#xff1a;仍有未知等待探索-CSDN博客 专题分栏&#xff1a;C 欢迎来指教&#xff01; 一、标准库中的list 1、了解 list&#xff1a;是一个双向带头循环链表&#xff0c;不支持随机访问&#xff08;即下标访问&#xff09;&#xff0c;任意位置的插入删除效率高。 …

1.使用uniapp搭建微信小程序项目并引入前端组件资源

文章目录 1. 项目配置1.1. 新建vue3项目1.2. 关联云空间1.3. 运行到微信开发者工具 2. 前端组件2.1. uniCloud的内置组件和扩展组件2.2. uView3.02.3. 在uniapp项目引入uview3 1. 项目配置 1.1. 新建vue3项目 由于我们要使用vue3而不是vue2&#xff0c;所以要选好版本&#x…

1688数据分析实操技巧||1688商品数据采集接口 数据分析

今天&#xff0c;聊一聊B2B平台的数据分析&#xff0c;以1688国内站为例。 1688平台数据接口 1688也属于阿里巴巴的体系&#xff0c;跟淘宝天猫运营很像&#xff0c;因此很多淘宝天猫的玩法调整后也适用于1688。数据分析也是如此。 在1688搞数据分析&#xff0c;搞数据化运营可…

路由策略与路由控制

1.路由控制工具 匹配工具1&#xff1a;访问控制列表 &#xff08;1&#xff09;通配符 当进行IP地址匹配的时候&#xff0c;后面会跟着32位掩码位&#xff0c;这32位称为通配符。 通配符&#xff0c;也是点分十进制格式&#xff0c;换算成二进制后&#xff0c;“0”表示“匹配…

(二刷)代码随想录第1天|704. 二分查找 27. 移除元素

704. 二分查找 704. 二分查找 - 力扣&#xff08;LeetCode&#xff09; 代码随想录 (programmercarl.com) 手把手带你撕出正确的二分法 | 二分查找法 | 二分搜索法 | LeetCode&#xff1a;704. 二分查找_哔哩哔哩_bilibili 给定一个 n 个元素有序的&#xff08;升序&#xff09…

(六)JSP教程——out对象

out对象是在JSP中经常使用到的对象&#xff0c;它本质上是一个输出流&#xff0c;前面已经多次使用&#xff0c;我们经常使用它的print()和println()方法&#xff0c;这些方法主要用于实现客户端数据的输出。通过out对象也可以直接向客户端发送一个由程序动态生成的HTML文件。 …

时序图详解

1.这是iic总线在回应时候的时序图&#xff0c;data in代表eeprom收到数据&#xff0c;回stm32的ack&#xff0c;数据回应&#xff0c;data out代表stm32收到eeprom的消息&#xff0c;数据输出ack回应 2.交叉线 代表在这一次输出高电平&#xff0c;或者在这一次也可能输出低电…

JAVA队列相关习题4

1. 用队列实现栈。 225. 用队列实现栈 - 力扣&#xff08;LeetCode&#xff09; 一个队列无法实现栈 尝试使用两个队列 1)push元素的时候应当放在那里&#xff1f;哪个队列不为空就放在哪里 2&#xff09;出栈的时候&#xff0c;出不为空的队列size-1元素&#xff0c;剩余元…

学QT的第三天~

ikun登录界面完善 #include "mywidget.h" void MyWidget::bth1() { if(edit3 ->text()"520cxk"&&edit4 ->text()"1314520") { //1.实例化一个QmessageBox类的对象 QMessageBox box(QMessageBox::Information, //图标 "恭喜…

文字转语音软件下载教程

文字转语音软件下载教程 一&#xff0c;Whisper下载二&#xff0c;ggml-medium语言模型下载三&#xff0c;导入模型下载四&#xff0c;使用方法 一&#xff0c;Whisper下载 网址&#xff1a;https://bittly.cc/uL9xs 下拉选择&#xff1a; 进入下载页面&#xff0c;下载Whis…

分享一些跟客户降价时候可以用的方法

这几天碰到一个沙特的客户&#xff0c;一开始发了一个别人的设计图来问价格。因为产品都是根据图纸定制的&#xff0c;我就问他是否确定了场地&#xff0c;有没有详细的场地尺寸&#xff0c;客户说有&#xff0c;稍后就给。 过了一天&#xff0c;他就给了一个超大的尺寸&#x…

图像处理之SVD检测显示屏缺陷(C++)

图像处理之SVD检测显示屏缺陷&#xff08;C&#xff09; 文章目录 图像处理之SVD检测显示屏缺陷&#xff08;C&#xff09;前言一、SVD算法简介二、代码实现总结 前言 显示屏缺陷检测是机器视觉领域的一处较广泛的应用场景&#xff0c;显示屏主要有LCD和OLED&#xff0c;缺陷类…

爬虫:爬取豆瓣电影

文章目录 前言一、pandas是什么&#xff1f;二、使用步骤 1.引入库2.读入数据总结 前言 上篇我们将到如何利用xpath的规则&#xff0c;那么这一次&#xff0c;我们将通过案例来告诉读者如何使用Xpath来定位到我们需要的数据&#xff0c;就算你不懂H5代码是怎么个嵌套或者十分复…

cesium 雷达遮罩(电弧球效果)

cesium 雷达遮罩(电弧球效果) 以下为源码直接复制可用 1、实现思路 通过修改“material”材质来实现轨迹球效果 2、代码示例 2.1 index.html <!DOCTYPE html> <html lang="en"><head><!

Python | Leetcode Python题解之第70题爬楼梯

题目&#xff1a; 题解&#xff1a; class Solution:def climbStairs(self, n: int) -> int:a, b 1, 1for _ in range(n - 1):a, b b, a breturn b

C#winfrom三层架构实现简单课程管理系统管理系统,三层架构实现增删改查

1. 项目展示 1.1登录展示 1.2添加课程信息展示 1.3课程信息管理-查询-修改-删除 1.4修改登录密码 2.项目功能介绍&#xff08;图&#xff09; 3.数据库设计 3.1 教师表设计 3.2 课程分类表 3.3 课程信息表 4. 创建样式界面 winfrom 超详细UI创建过程 实现双色球选号器UI界面…
最新文章