C++ 仿函数
一、介绍
C++STL中的仿函数,又被称为函数对象,其实就是:重载了()运算符的类。
因为在使用重载的operator()时,类似于函数调用,因此被称为仿函数。
※注意※:仿函数本质上是一个类,不是函数。
二、仿函数与函数的区别
二者最主要的区别,就在于仿函数本质上是一个类,所以类的内部可以用自定义成员来记录更多的信息和状态。
三、仿函数的使用
下面举一个简单的例子,让各位能直观地感受到仿函数的妙用。
//仿函数
class ShowHello {
private:int showCount;//用于记录show次数
public:ShowHello() {//初始0次showshowCount = 0;}//重载()运算符void operator()() {cout << "Hello" << endl;showCount++;//每次使用,show次数+1}int getShowCount() {return showCount;}
};//主函数
int main() {ShowHello showhello;showhello();showhello();showhello();showhello();cout << "showHello的次数为:" << showhello.getShowCount() << endl;return 0;
}
上述例子中,我们可以通过类内部的showCount成员来统计所谓的函数调用次数,这是普通函数无法做到的。程序的执行结果如下所示:

四、内建仿函数
C++ STL中有一些内部的仿函数,被称为内建仿函数。他们通常分为三类:算术仿函数、关系仿函数、逻辑仿函数。在使用时,需要包含头文件#include<functional>。
4.1 算术仿函数
C++ STL 提供了一些简单的四则运算:
| 声明 (这里不用蓝色,而是用褐色,请各位记住:仿函数不是函数,是类!) | 解释 |
| template<class T> T plus<T> (二元运算) | 加法 仿函数 |
| template<class T> T minus<T> (二元运算) | 减法 仿函数 |
| template<class T> T multiplies<T> (二元运算) | 乘法 仿函数 |
| template<class T> T divides<T> (二元运算) | 除法 仿函数 |
| template<class T> T modulus<T> (二元运算) | 取余 仿函数 |
| template<class T> T negate<T> (一元运算) | 取反 仿函数 |
//加法 仿函数
plus<int> add;
//666 + 222 = 888
cout << add(666, 222) << endl;//888//减法 仿函数
minus<int> sub;
//666 - 222 = 444
cout << sub(666, 222) << endl;//444//乘法 仿函数
multiplies<int> mul;
//222 * 2 = 444
cout << mul(222, 2) << endl;//444//除法 仿函数
divides<int> div;
//666 / 222 = 3
cout << div(666, 222) << endl;//3//取余 仿函数
modulus<int> mod;
//666 % 300 = 66
cout << mod(666, 300) << endl;//66//取反 仿函数
negate<int> neg;
//-50 -> 50
cout << neg(-50) << endl;//50
4.2 关系仿函数
C++ STL 提供了一些表示二者大小关系的仿函数:
| 声明 (这里不用蓝色,而是用褐色,请各位记住:仿函数不是函数,是类!) | 解释 |
| template<class T> bool equal_to<T> (二元运算) | 等于 仿函数 |
| template<class T> bool not_equal_to<T> (二元运算) | 不等于 仿函数 |
| template<class T> bool greater<T> (二元运算) | 大于 仿函数 |
| template<class T> bool greater_equal<T> (二元运算) | 大于等于 仿函数 |
| template<class T> bool less<T> (二元运算) | 小于 仿函数 |
| template<class T> bool less_equal<T> (二元运算) | 小于等于 仿函数 |
//等于 仿函数
equal_to<int> eql;
// 555 == 666 : false
cout << boolalpha << eql(555, 666) << endl;//false//不等于 仿函数
not_equal_to<int> neql;
// 555 != 666 : true
cout << boolalpha << neql(555, 666) << endl;//true//大于 仿函数
greater<int> grt;
// 666 > 666 : false
cout << boolalpha << grt(555, 666) << endl;//false//大于等于 仿函数
greater_equal<int> grteql;
// 666 >= 666 : true
cout << boolalpha << grteql(666, 666) << endl;//true//小于 仿函数
less<int> ls;
// 555 < 666 : true
cout << boolalpha << ls(555, 666) << endl;//true//小于等于 仿函数
less_equal<int> lseql;
// 666 <= 666 : true
cout << boolalpha << lseql(666, 666) << endl;//true
4.3 逻辑仿函数
C++ STL提供了一些逻辑运算的仿函数:
| 声明 (这里不用蓝色,而是用褐色,请各位记住:仿函数不是函数,是类!) | 解释 |
| template<class T> bool logical_and<T> (二元运算) | 逻辑与 仿函数 |
| template<class T> bool logical_or<T> (二元运算) | 逻辑或 仿函数 |
| template<class T> bool logical_not<T> (一元运算) | 逻辑非 仿函数 |
//逻辑与
logical_and<int> land;
// 0 && 6 = false
cout << boolalpha << land(0, 6) << endl;//false//逻辑或
logical_or<int> lor;
// 0 || 6 = true
cout << boolalpha << lor(0, 6) << endl;//true
这里我们用逻辑非来解释一下,平时使用内建仿函数的方便之处:
假设我们目前的需求是将向量v0中的全部bool元素取反,再存入v1中:
vector<bool> v0;
vector<bool> v1;v0.push_back(true);
v0.push_back(false);
v0.push_back(true);
v0.push_back(false);//v0 = true false true false
cout << "v0 : [";
for (bool e : v0) {cout << boolalpha << e << " ";
}
cout << "]" << endl;//设置v1的大小
v1.resize(v0.size());
//设置将v0的元素,取反后装入v1
transform(v0.begin(), v0.end(), v1.begin(), logical_not<bool>());//v1 = false true false true
cout << "v1 : [";
for (bool e : v1) {cout << boolalpha << e << " ";
}
cout << "]" << endl;
注意:如果要使用transform函数,需要#include<algorithm>。程序运行结果如下:

相关文章:
C++ 仿函数
一、介绍 CSTL中的仿函数,又被称为函数对象,其实就是:重载了()运算符的类。 因为在使用重载的operator()时,类似于函数调用,因此被称为仿函数。 ※注意※:仿函数本质上是一个类,不是函数。 二…...
Redhat 安装 docker 网络连接超时问题
目录 添加阿里云的Docker CE仓库 更新YUM缓存 安装 Docker Engine 启动并设置Docker自启动 验证 Docker 安装 [userlocalhost ~]$ sudo yum-config-manager --add-repohttps://download.docker.com/linux/centos/docker-ce.repo 正在更新 Subscription Management 软件仓库…...
Java面试题:undo log和redo log
undo log和redo log的区别 缓冲池(buffer pool): 主内存中的一个区域,可以缓存磁盘上经常被操作的数据,在执行crud时先操作缓冲池的数据以减少磁盘io 数据页(page): InnoDB存储引擎管理的最小单元,每页大小为16kb,页中存储的是行数据 redo log 重做日志,用来实现任务的持…...
【Scrapy】Scrapy 中间件等级设置规则
准我快乐地重饰演某段美丽故事主人 饰演你旧年共寻梦的恋人 再去做没流着情泪的伊人 假装再有从前演过的戏份 重饰演某段美丽故事主人 饰演你旧年共寻梦的恋人 你纵是未明白仍夜深一人 穿起你那无言毛衣当跟你接近 🎵 陈慧娴《傻女》 Scrapy 是…...
SDK环境的安装(测试使用)
1、安装 将文件解压至目录,我的目录为:D:\Program Files\Android 解压后如下: 下载链接如下: sdk下载 提取码见文章最后: 2、配置环境 1、在环境变量中,选择系统变量,点击新建。 变量名:ANDROID_HOME 变量值:“你自己的android-sdk安装路径” (例如我的:D:\Pro…...
【matlab】【python】爬虫实战
目录 引言 具体步骤 1.设置请求选项 2.发送请求并获取响应 3.设置正则表达式 4.执行正则表达式匹配 matlab完整代码 python代码示例 引言 在当今这个信息爆炸的时代,数据已成为推动社会进步和企业发展的核心动力之一。随着互联网的普及和技术的飞速发展&am…...
Android TV跨平台开发心得
这半年来陆陆续续做了一堆poc,刚开始是flutter,结果领导叫停了,说有其他部门做一样的事,真不巧;后来是react native,开发了个demo,上报上去了已经;现在又要做android nativewebview …...
View->裁剪框View的绘制,手势处理
XML文件 <?xml version"1.0" encoding"utf-8"?> <RelativeLayout xmlns:android"http://schemas.android.com/apk/res/android"android:layout_width"match_parent"android:layout_height"match_parent"android…...
语言模型的进化:从NLP到LLM的跨越之旅
在人工智能的浩瀚宇宙中,自然语言处理(NLP)一直是一个充满挑战和机遇的领域。随着技术的发展,我们见证了从传统规则到统计机器学习,再到深度学习和预训练模型的演进。如今,我们站在了大型语言模型ÿ…...
应急响应--网站(web)入侵篡改指南
免责声明:本文... 目录 被入侵常见现象: 首要任务: 分析思路: 演示案例: IIS&.NET-注入-基于时间配合日志分析 Apache&PHP-漏洞-基于漏洞配合日志分析 Tomcat&JSP-弱口令-基于后门配合日志分析 (推荐) Webshell 查杀-常规后门&…...
vue3+vue-router+vite 实现动态路由
文章中出现的代码是演示版本,仅供参考,实际的业务需求会更加复杂 什么是动态路由 什么场景会用到动态路由 举一个最常见的例子,比如说我们要开发一个后台管理系统,一般来说后台管理系统都会分角色登录,这个时候也就涉…...
Okhttp hostnameVerifier详解
hostnameVerifier 方法简介核心原理参考资料 方法简介 本篇博文以Okhttp 4.6.0来解析hostnameVerfier的作用,顾名思义,该方法的主要作用就是鉴定hostnname的合法性。Okhttp在初始化的时候我们可以自己配置hostnameVerfier: new OkHttpClien…...
TCP的p2p网络模式
TCP的p2p网络模式 1、tcp连接的状态有以下11种 CLOSED:关闭状态LISTEN:服务端状态,等待客户端发起连接请求SYN_SENT:客户端已发送同步连接请求,等待服务端相应SYN_RECEIVED:服务器收到客户端的SYN请请求&…...
力扣-贪心算法4
406.根据身高重建队列 406. 根据身高重建队列 题目 假设有打乱顺序的一群人站成一个队列,数组 people 表示队列中一些人的属性(不一定按顺序)。每个 people[i] [hi, ki] 表示第 i 个人的身高为 hi ,前面 正好 有 ki 个身高大于或…...
动手学深度学习6.2 图像卷积-笔记练习(PyTorch)
以下内容为结合李沐老师的课程和教材补充的学习笔记,以及对课后练习的一些思考,自留回顾,也供同学之人交流参考。 本节课程地址:卷积层_哔哩哔哩_bilibili 代码_哔哩哔哩_bilibili 本节教材地址:6.2. 图像卷积 — 动…...
展开说说:Android服务之bindService解析
前面两篇文章我们分别总结了Android四种Service的基本使用以及源码层面总结一下startService的执行过程,本篇继续从源码层面总结bindService的执行过程。 本文依然按着是什么?有什么?怎么用?啥原理?的步骤来分析。 b…...
node-sass 老版本4.14.0 安装失败解决办法
旧项目 npm install 发现 node-sass 安装 失败 切换淘宝镜像之后 不能完全解决问题。因为需要编译,本地没有Python环境不能实现 安装node-sass时,在install阶段会从Github上下载一个叫binding.node的文件,而「GitHub Releases」里的文件…...
最近很火的字幕截图生成器
网址 https://disksing.com/fake-screenshot/ 最近很火的字幕截图生成器,对于自媒体来说真的太实用了 另外透露一下,你仔细研究就会发现,这是个纯前端的项目...
使用RabbitMQ实现可靠的消息传递机制
使用RabbitMQ实现可靠的消息传递机制 大家好,我是微赚淘客系统3.0的小编,也是冬天不穿秋裤,天冷也要风度的程序猿! 1. RabbitMQ简介 RabbitMQ是一个开源的消息代理软件,实现了高级消息队列协议(AMQP&…...
Function Call ReACT,Agent应用落地的加速器_qwen的function calling和react有什么不同
探索智能体Agent的未来之路:Function Call与ReACT框架的较量,谁能引领未来? 引言 各大平台出现智能体应用创建,智能体逐渐落地,背后的使用哪种框架? 随着各大平台,例如百度千帆APPbuilder、阿…...
深入剖析AI大模型:大模型时代的 Prompt 工程全解析
今天聊的内容,我认为是AI开发里面非常重要的内容。它在AI开发里无处不在,当你对 AI 助手说 "用李白的风格写一首关于人工智能的诗",或者让翻译模型 "将这段合同翻译成商务日语" 时,输入的这句话就是 Prompt。…...
K8S认证|CKS题库+答案| 11. AppArmor
目录 11. AppArmor 免费获取并激活 CKA_v1.31_模拟系统 题目 开始操作: 1)、切换集群 2)、切换节点 3)、切换到 apparmor 的目录 4)、执行 apparmor 策略模块 5)、修改 pod 文件 6)、…...
智能在线客服平台:数字化时代企业连接用户的 AI 中枢
随着互联网技术的飞速发展,消费者期望能够随时随地与企业进行交流。在线客服平台作为连接企业与客户的重要桥梁,不仅优化了客户体验,还提升了企业的服务效率和市场竞争力。本文将探讨在线客服平台的重要性、技术进展、实际应用,并…...
3403. 从盒子中找出字典序最大的字符串 I
3403. 从盒子中找出字典序最大的字符串 I 题目链接:3403. 从盒子中找出字典序最大的字符串 I 代码如下: class Solution { public:string answerString(string word, int numFriends) {if (numFriends 1) {return word;}string res;for (int i 0;i &…...
代理篇12|深入理解 Vite中的Proxy接口代理配置
在前端开发中,常常会遇到 跨域请求接口 的情况。为了解决这个问题,Vite 和 Webpack 都提供了 proxy 代理功能,用于将本地开发请求转发到后端服务器。 什么是代理(proxy)? 代理是在开发过程中,前端项目通过开发服务器,将指定的请求“转发”到真实的后端服务器,从而绕…...
Linux系统部署KES
1、安装准备 1.版本说明V008R006C009B0014 V008:是version产品的大版本。 R006:是release产品特性版本。 C009:是通用版 B0014:是build开发过程中的构建版本2.硬件要求 #安全版和企业版 内存:1GB 以上 硬盘…...
MySQL 主从同步异常处理
阅读原文:https://www.xiaozaoshu.top/articles/mysql-m-s-update-pk MySQL 做双主,遇到的这个错误: Could not execute Update_rows event on table ... Error_code: 1032是 MySQL 主从复制时的经典错误之一,通常表示ÿ…...
数学建模-滑翔伞伞翼面积的设计,运动状态计算和优化 !
我们考虑滑翔伞的伞翼面积设计问题以及运动状态描述。滑翔伞的性能主要取决于伞翼面积、气动特性以及飞行员的重量。我们的目标是建立数学模型来描述滑翔伞的运动状态,并优化伞翼面积的设计。 一、问题分析 滑翔伞在飞行过程中受到重力、升力和阻力的作用。升力和阻力与伞翼面…...
水泥厂自动化升级利器:Devicenet转Modbus rtu协议转换网关
在水泥厂的生产流程中,工业自动化网关起着至关重要的作用,尤其是JH-DVN-RTU疆鸿智能Devicenet转Modbus rtu协议转换网关,为水泥厂实现高效生产与精准控制提供了有力支持。 水泥厂设备众多,其中不少设备采用Devicenet协议。Devicen…...
工厂方法模式和抽象工厂方法模式的battle
1.案例直接上手 在这个案例里面,我们会实现这个普通的工厂方法,并且对比这个普通工厂方法和我们直接创建对象的差别在哪里,为什么需要一个工厂: 下面的这个是我们的这个案例里面涉及到的接口和对应的实现类: 两个发…...
