当前位置: 首页 > news >正文

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中的仿函数&#xff0c;又被称为函数对象&#xff0c;其实就是&#xff1a;重载了()运算符的类。 因为在使用重载的operator()时&#xff0c;类似于函数调用&#xff0c;因此被称为仿函数。 ※注意※&#xff1a;仿函数本质上是一个类&#xff0c;不是函数。 二…...

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 中间件等级设置规则

准我快乐地重饰演某段美丽故事主人 饰演你旧年共寻梦的恋人 再去做没流着情泪的伊人 假装再有从前演过的戏份 重饰演某段美丽故事主人 饰演你旧年共寻梦的恋人 你纵是未明白仍夜深一人 穿起你那无言毛衣当跟你接近 &#x1f3b5; 陈慧娴《傻女》 Scrapy 是…...

SDK环境的安装(测试使用)

1、安装 将文件解压至目录,我的目录为:D:\Program Files\Android 解压后如下: 下载链接如下: sdk下载 提取码见文章最后: 2、配置环境 1、在环境变量中,选择系统变量,点击新建。 变量名:ANDROID_HOME 变量值:“你自己的android-sdk安装路径” (例如我的:D:\Pro…...

【matlab】【python】爬虫实战

目录 引言 具体步骤 1.设置请求选项 2.发送请求并获取响应 3.设置正则表达式 4.执行正则表达式匹配 matlab完整代码 python代码示例 引言 在当今这个信息爆炸的时代&#xff0c;数据已成为推动社会进步和企业发展的核心动力之一。随着互联网的普及和技术的飞速发展&am…...

Android TV跨平台开发心得

这半年来陆陆续续做了一堆poc&#xff0c;刚开始是flutter&#xff0c;结果领导叫停了&#xff0c;说有其他部门做一样的事&#xff0c;真不巧&#xff1b;后来是react native&#xff0c;开发了个demo&#xff0c;上报上去了已经&#xff1b;现在又要做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的跨越之旅

在人工智能的浩瀚宇宙中&#xff0c;自然语言处理&#xff08;NLP&#xff09;一直是一个充满挑战和机遇的领域。随着技术的发展&#xff0c;我们见证了从传统规则到统计机器学习&#xff0c;再到深度学习和预训练模型的演进。如今&#xff0c;我们站在了大型语言模型&#xff…...

应急响应--网站(web)入侵篡改指南

免责声明:本文... 目录 被入侵常见现象: 首要任务&#xff1a; 分析思路&#xff1a; 演示案例: IIS&.NET-注入-基于时间配合日志分析 Apache&PHP-漏洞-基于漏洞配合日志分析 Tomcat&JSP-弱口令-基于后门配合日志分析 (推荐) Webshell 查杀-常规后门&…...

vue3+vue-router+vite 实现动态路由

文章中出现的代码是演示版本&#xff0c;仅供参考&#xff0c;实际的业务需求会更加复杂 什么是动态路由 什么场景会用到动态路由 举一个最常见的例子&#xff0c;比如说我们要开发一个后台管理系统&#xff0c;一般来说后台管理系统都会分角色登录&#xff0c;这个时候也就涉…...

Okhttp hostnameVerifier详解

hostnameVerifier 方法简介核心原理参考资料 方法简介 本篇博文以Okhttp 4.6.0来解析hostnameVerfier的作用&#xff0c;顾名思义&#xff0c;该方法的主要作用就是鉴定hostnname的合法性。Okhttp在初始化的时候我们可以自己配置hostnameVerfier&#xff1a; new OkHttpClien…...

TCP的p2p网络模式

TCP的p2p网络模式 1、tcp连接的状态有以下11种 CLOSED&#xff1a;关闭状态LISTEN&#xff1a;服务端状态&#xff0c;等待客户端发起连接请求SYN_SENT&#xff1a;客户端已发送同步连接请求&#xff0c;等待服务端相应SYN_RECEIVED&#xff1a;服务器收到客户端的SYN请请求&…...

力扣-贪心算法4

406.根据身高重建队列 406. 根据身高重建队列 题目 假设有打乱顺序的一群人站成一个队列&#xff0c;数组 people 表示队列中一些人的属性&#xff08;不一定按顺序&#xff09;。每个 people[i] [hi, ki] 表示第 i 个人的身高为 hi &#xff0c;前面 正好 有 ki 个身高大于或…...

动手学深度学习6.2 图像卷积-笔记练习(PyTorch)

以下内容为结合李沐老师的课程和教材补充的学习笔记&#xff0c;以及对课后练习的一些思考&#xff0c;自留回顾&#xff0c;也供同学之人交流参考。 本节课程地址&#xff1a;卷积层_哔哩哔哩_bilibili 代码_哔哩哔哩_bilibili 本节教材地址&#xff1a;6.2. 图像卷积 — 动…...

展开说说:Android服务之bindService解析

前面两篇文章我们分别总结了Android四种Service的基本使用以及源码层面总结一下startService的执行过程&#xff0c;本篇继续从源码层面总结bindService的执行过程。 本文依然按着是什么&#xff1f;有什么&#xff1f;怎么用&#xff1f;啥原理&#xff1f;的步骤来分析。 b…...

node-sass 老版本4.14.0 安装失败解决办法

旧项目 npm install 发现 node-sass 安装 失败 切换淘宝镜像之后 不能完全解决问题。因为需要编译&#xff0c;本地没有Python环境不能实现 安装node-sass时&#xff0c;在install阶段会从Github上下载一个叫binding.node的文件&#xff0c;而「GitHub Releases」里的文件…...

最近很火的字幕截图生成器

网址 https://disksing.com/fake-screenshot/ 最近很火的字幕截图生成器&#xff0c;对于自媒体来说真的太实用了 另外透露一下&#xff0c;你仔细研究就会发现&#xff0c;这是个纯前端的项目...

使用RabbitMQ实现可靠的消息传递机制

使用RabbitMQ实现可靠的消息传递机制 大家好&#xff0c;我是微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01; 1. RabbitMQ简介 RabbitMQ是一个开源的消息代理软件&#xff0c;实现了高级消息队列协议&#xff08;AMQP&…...

Function Call ReACT,Agent应用落地的加速器_qwen的function calling和react有什么不同

探索智能体Agent的未来之路&#xff1a;Function Call与ReACT框架的较量&#xff0c;谁能引领未来&#xff1f; 引言 各大平台出现智能体应用创建&#xff0c;智能体逐渐落地&#xff0c;背后的使用哪种框架&#xff1f; 随着各大平台&#xff0c;例如百度千帆APPbuilder、阿…...

eNSP-Cloud(实现本地电脑与eNSP内设备之间通信)

说明&#xff1a; 想象一下&#xff0c;你正在用eNSP搭建一个虚拟的网络世界&#xff0c;里面有虚拟的路由器、交换机、电脑&#xff08;PC&#xff09;等等。这些设备都在你的电脑里面“运行”&#xff0c;它们之间可以互相通信&#xff0c;就像一个封闭的小王国。 但是&#…...

基于大模型的 UI 自动化系统

基于大模型的 UI 自动化系统 下面是一个完整的 Python 系统,利用大模型实现智能 UI 自动化,结合计算机视觉和自然语言处理技术,实现"看屏操作"的能力。 系统架构设计 #mermaid-svg-2gn2GRvh5WCP2ktF {font-family:"trebuchet ms",verdana,arial,sans-…...

《Qt C++ 与 OpenCV:解锁视频播放程序设计的奥秘》

引言:探索视频播放程序设计之旅 在当今数字化时代,多媒体应用已渗透到我们生活的方方面面,从日常的视频娱乐到专业的视频监控、视频会议系统,视频播放程序作为多媒体应用的核心组成部分,扮演着至关重要的角色。无论是在个人电脑、移动设备还是智能电视等平台上,用户都期望…...

day52 ResNet18 CBAM

在深度学习的旅程中&#xff0c;我们不断探索如何提升模型的性能。今天&#xff0c;我将分享我在 ResNet18 模型中插入 CBAM&#xff08;Convolutional Block Attention Module&#xff09;模块&#xff0c;并采用分阶段微调策略的实践过程。通过这个过程&#xff0c;我不仅提升…...

mongodb源码分析session执行handleRequest命令find过程

mongo/transport/service_state_machine.cpp已经分析startSession创建ASIOSession过程&#xff0c;并且验证connection是否超过限制ASIOSession和connection是循环接受客户端命令&#xff0c;把数据流转换成Message&#xff0c;状态转变流程是&#xff1a;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 矩阵&#xff0c;其中每行&#xff0c;每列以及两条对角线上的各数之和都相等。 给定一个由整数组成的row x col 的 grid&#xff0c;其中有多少个 3 3 的 “幻方” 子矩阵&am…...

基于Java Swing的电子通讯录设计与实现:附系统托盘功能代码详解

JAVASQL电子通讯录带系统托盘 一、系统概述 本电子通讯录系统采用Java Swing开发桌面应用&#xff0c;结合SQLite数据库实现联系人管理功能&#xff0c;并集成系统托盘功能提升用户体验。系统支持联系人的增删改查、分组管理、搜索过滤等功能&#xff0c;同时可以最小化到系统…...

并发编程 - go版

1.并发编程基础概念 进程和线程 A. 进程是程序在操作系统中的一次执行过程&#xff0c;系统进行资源分配和调度的一个独立单位。B. 线程是进程的一个执行实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位。C.一个进程可以创建和撤销多个线程;同一个进程中…...

BLEU评分:机器翻译质量评估的黄金标准

BLEU评分&#xff1a;机器翻译质量评估的黄金标准 1. 引言 在自然语言处理(NLP)领域&#xff0c;衡量一个机器翻译模型的性能至关重要。BLEU (Bilingual Evaluation Understudy) 作为一种自动化评估指标&#xff0c;自2002年由IBM的Kishore Papineni等人提出以来&#xff0c;…...