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、阿…...

eNSP-Cloud(实现本地电脑与eNSP内设备之间通信)
说明: 想象一下,你正在用eNSP搭建一个虚拟的网络世界,里面有虚拟的路由器、交换机、电脑(PC)等等。这些设备都在你的电脑里面“运行”,它们之间可以互相通信,就像一个封闭的小王国。 但是&#…...
基于大模型的 UI 自动化系统
基于大模型的 UI 自动化系统 下面是一个完整的 Python 系统,利用大模型实现智能 UI 自动化,结合计算机视觉和自然语言处理技术,实现"看屏操作"的能力。 系统架构设计 #mermaid-svg-2gn2GRvh5WCP2ktF {font-family:"trebuchet ms",verdana,arial,sans-…...

《Qt C++ 与 OpenCV:解锁视频播放程序设计的奥秘》
引言:探索视频播放程序设计之旅 在当今数字化时代,多媒体应用已渗透到我们生活的方方面面,从日常的视频娱乐到专业的视频监控、视频会议系统,视频播放程序作为多媒体应用的核心组成部分,扮演着至关重要的角色。无论是在个人电脑、移动设备还是智能电视等平台上,用户都期望…...
day52 ResNet18 CBAM
在深度学习的旅程中,我们不断探索如何提升模型的性能。今天,我将分享我在 ResNet18 模型中插入 CBAM(Convolutional Block Attention Module)模块,并采用分阶段微调策略的实践过程。通过这个过程,我不仅提升…...
mongodb源码分析session执行handleRequest命令find过程
mongo/transport/service_state_machine.cpp已经分析startSession创建ASIOSession过程,并且验证connection是否超过限制ASIOSession和connection是循环接受客户端命令,把数据流转换成Message,状态转变流程是:State::Created 》 St…...

376. Wiggle Subsequence
376. Wiggle Subsequence 代码 class Solution { public:int wiggleMaxLength(vector<int>& nums) {int n nums.size();int res 1;int prediff 0;int curdiff 0;for(int i 0;i < n-1;i){curdiff nums[i1] - nums[i];if( (prediff > 0 && curdif…...

第 86 场周赛:矩阵中的幻方、钥匙和房间、将数组拆分成斐波那契序列、猜猜这个单词
Q1、[中等] 矩阵中的幻方 1、题目描述 3 x 3 的幻方是一个填充有 从 1 到 9 的不同数字的 3 x 3 矩阵,其中每行,每列以及两条对角线上的各数之和都相等。 给定一个由整数组成的row x col 的 grid,其中有多少个 3 3 的 “幻方” 子矩阵&am…...
基于Java Swing的电子通讯录设计与实现:附系统托盘功能代码详解
JAVASQL电子通讯录带系统托盘 一、系统概述 本电子通讯录系统采用Java Swing开发桌面应用,结合SQLite数据库实现联系人管理功能,并集成系统托盘功能提升用户体验。系统支持联系人的增删改查、分组管理、搜索过滤等功能,同时可以最小化到系统…...

并发编程 - go版
1.并发编程基础概念 进程和线程 A. 进程是程序在操作系统中的一次执行过程,系统进行资源分配和调度的一个独立单位。B. 线程是进程的一个执行实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位。C.一个进程可以创建和撤销多个线程;同一个进程中…...
BLEU评分:机器翻译质量评估的黄金标准
BLEU评分:机器翻译质量评估的黄金标准 1. 引言 在自然语言处理(NLP)领域,衡量一个机器翻译模型的性能至关重要。BLEU (Bilingual Evaluation Understudy) 作为一种自动化评估指标,自2002年由IBM的Kishore Papineni等人提出以来,…...