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;//调用方式1a.operator()(1,2);


2、a1(操作数);

	//调用方式2a(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.mzph.cn/pingmian/5771.shtml

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

相关文章

Linux(ubuntu)—— 用户管理user 用户组group

一、用户 1.1、查看所有用户 cat /etc/passwd 1.2、新增用户 useradd 命令&#xff0c;我这里用的是2.4的命令。 然后&#xff0c;需要设置密码 passwd student 只有root用户才能用passwd命令设置其他用户的密码&#xff0c;普通用户只能够设置自己的密码 二、组 2.1查看…

mybatis-plus报错:Can not find table primary key in Class

TableInfoHelper - [initTableFields,327] - Can not find table primary key in Class: "*.*.User".表里有主键&#xff0c;但是报找不到主键&#xff0c;因为mybatis plus 里面自动匹配主键字段为id 当数据库中的主键不为id时会报出上述错误。 解决: 添加下面代…

基于ROS从零开始构建自主移动机器人:仿真和硬件

书籍&#xff1a;Build Autonomous Mobile Robot from Scratch using ROS&#xff1a;Simulation and Hardware 作者&#xff1a;Rajesh Subramanian 出版&#xff1a;Apress 书籍下载-《基于ROS从零开始构建自主移动机器人&#xff1a;仿真和硬件》您将开始理解自主机器人发…

SQL常见约束及外键约束删除更新行为

一.约束 1.概念 约束是作用于表中字段上的规则&#xff0c;用于限制存储在表中的数据。 2.目的&#xff1a; 保证数据库中数据的正确、有效性和完整性。 3.添加约束两种方式 可以在创建表/修改表的时候添加约束。 在为字段添加约束时&#xff0c;我们只需要在字段之后加…

aic8800 linux

编译方法参考 http://t.csdnimg.cn/epR89 aic8800 源码在 github 里。同样需要 cfg80211 和 mac80211 aic_load_fw/aic_load_fw.ko aic8800_fdrv/aic8800_fdrv.ko都放到放 .ko 的地方 src/USB/driver_fw/drivers/aic8800 就是源码&#xff0c;没有蓝牙的型号不需要aic_btusb …

ip地址与硬件地址的区别是什么

在数字世界的浩瀚海洋中&#xff0c;每一台联网的设备都需要一个独特的标识来确保信息的准确传输。这些标识&#xff0c;我们通常称之为IP地址和硬件地址。虽然它们都是用来识别网络设备的&#xff0c;但各自扮演的角色和所处的层次却大相径庭。虎观代理小二将带您深入了解IP地…

6.k8s中的secrets资源

一、Secret secrets资源&#xff0c;类似于configmap资源&#xff0c;只是secrets资源是用来传递重要的信息的&#xff1b; secret资源就是将value的值使用base64编译后传输&#xff0c;当pod引用secret后&#xff0c;k8s会自动将其base64的编码&#xff0c;反编译回正常的字符…

HTTP/1.1、HTTP/2、HTTP/3 的演变

HTTP/1.1、HTTP/2、HTTP/3 的演变 HTTP/1.1 相比 HTTP/1.0 提高了什么性能&#xff1f;HTTP/2 做了什么优化&#xff1f;HTTP/3 做了哪些优化&#xff1f; HTTP/1.1 相比 HTTP/1.0 提高了什么性能&#xff1f; HTTP/1.1 相比 HTTP/1.0 性能上的改进&#xff1a; 使用长连接的…

【Spring】5.Spring事务中的@Transactional注解剖析

事务是确保数据完整性的关键机制。Spring框架通过Transactional注解提供了一种声明式事务管理的方式&#xff0c;极大地简化了事务的使用。在本篇文章中&#xff0c;我们将深入探讨Spring的Transactional注解&#xff0c;包括它的工作原理、可用属性、如何配置以及在嵌套事务场…

再生龙clonezilla使用方法

目录 本文相关内容的介绍服务器窗口重定向引导进入再生龙系统检查本机操作系统的引导模式 再生龙基础功能选择选择 device-image选择ssh_server 网络配置ssh_server 配置ssh_server 镜像存储路径 再生龙抓取操作系统抓取镜像的命名 再生龙恢复操作系统拉取镜像的选择 本文相关内…

【Docker学习】docker checkpoint简单了解

docker checkpoint是一个试验性的功能&#xff0c;旨在用于测试和反馈&#xff0c;未来不确定是否会发生变化或是被删除掉&#xff0c;现有的功能我们可以简单了解了解。 docker checkpoint主要用于管理检查点&#xff08;CheckPoint&#xff09;。检查点&#xff08;CheckPoi…

【16-Ⅰ】Head First Java 学习笔记

HeadFirst Java 本人有C语言基础&#xff0c;通过阅读Java廖雪峰网站&#xff0c;简单速成了java&#xff0c;但对其中一些入门概念有所疏漏&#xff0c;阅读本书以弥补。 第一章 Java入门 第二章 面向对象 第三章 变量 第四章 方法操作实例变量 第五章 程序实战 第六章 Java…

收藏:关于闭包表

参考视频&#xff1a;【IT老齐513】经典树形数据结构-闭包表_哔哩哔哩_bilibili&#xff0c; 这个视频系列的确不错&#xff0c;500多个了。 闭包表&#xff0c;其实就是用来做树形结构的时候&#xff0c;如何快速找到某个节点下的所有后代节点&#xff0c;用两张表去完成&…

【html知识】用html写一个简单的个人网页

介绍&#xff1a; 这是一个HTML和CSS的代码段&#xff0c;它构建了一个基本的个人网页布局。以下是该代码的详细介绍&#xff1a; HTML部分&#xff1a; 文档类型与基础结构&#xff1a;<!DOCTYPE html> 声明了文档类型为HTML5。<html lang"en"> 定义…

设计模式-03 设计模式-依赖倒转原则案例分析

设计模式-03 设计模式-依赖倒转原则案例分析 目录 设计模式-02 设计模式-依赖倒转原则案例分析 1.定义 2.内涵 3.案例对比 4.注意事项 5.最佳实践 6.总结 1.定义 依赖倒转原则&#xff08;Dependency Inversion Principle&#xff0c;简称DIP&#xff09;高层级的模块…

ModuleNotFoundError: No module named ‘pyautogui‘

ModuleNotFoundError: No module named pyautogui 这个错误意味着你的Python环境中没有安装pyautogui这个模块。pyautogui是一个用于程序化地控制鼠标和键盘的Python模块&#xff0c;常常用于自动化任务、GUI测试等场景。 为了解决这个问题&#xff0c;你需要安装pyautogui模块…

Java实现以图识图功能模块(简单案例)

由于完整的以图识图系统代码较长且复杂&#xff0c;这里仅提供使用OpenCV进行特征提取和比较的简化版示例代码。 1. 引入OpenCV Java库 首先&#xff0c;你需要在项目中引入OpenCV的Java库。这通常涉及将OpenCV的jar包添加到项目的类路径中。 2. 提取图像特征 使用OpenCV的…

机器学习实战-聚类算法

聚类算法是一种无监督学习的算法&#xff0c;用于将数据集中的数据分成不同的聚类或组。聚类算法是数据挖掘和机器学习领域中常见的技术之一&#xff0c;具有广泛的应用。 以下是聚类算法的一些知识点&#xff1a; 聚类算法的目的是将数据集划分为不同的组&#xff0c;使得组内…

C++ 矩阵

目录 了解矩阵的数学原理&#xff08;大学线性代数&#xff09; 矩阵及转置矩阵 矩阵乘法 矩阵快速幂 相伴矩阵模板 [相伴矩阵,快速矩阵幂]CSES1722 Fibonacci Numbers 了解矩阵的数学原理&#xff08;大学线性代数&#xff09; 矩阵及转置矩阵 这里A就是一个矩阵&…

uniapp 桌面应用插件 Ba-Launcher

简介&#xff08;下载地址&#xff09; Ba-Launcher 可以让你的应用成为简单的桌面应用&#xff0c;如需扩展功能&#xff0c;请联系我。 截图展示 可关注博客&#xff0c;实时更新最新插件&#xff1a; uniapp 常用原生插件大全 使用方法 使用方法也很简单&#xff0c;在插…