C++ 函数对象 详解

news2024/12/29 11:29:49

目录

🤔函数对象:

🤔本质:

🤔特点:

代码示例:

运行结果:

🤔 内置函数对象:

1.算数仿函数

代码示例:

运行结果:

 2.关系仿函数

代码示例:

运行结果:

3.逻辑仿函数:

代码示例:

运行结果:

🤔结束! 

 


🤔函数对象:

    📖用类创建出来的一个对象,调用起来语法结构像调用函数,我们把这种对象叫做函数对象。它通过重载函数调用操作符(operator())来实现可调用操作。可以将函数对象看作是一种可调用的“函数”,它可以封装一组函数调用所需要的状态和行为。函数对象可以像普通函数一样被调用,也可以像普通对象一样被拷贝、赋值、作为参数传递给其他函数等。函数对象广泛地应用于STL算法中,例如排序和查找等操作。函数对象可以使程序更加灵活和高效,因为它可以在运行时自定义函数的行为。

📖而函数对象的重点在于学会使用C++提供给我们的内置函数对象。

🤔本质:

   📖  本质是一个对象。

🤔特点:

📖1.函数对象在使用的时候,可以像普通的函数那样调用,可以有参数,可以有返回值
📖2.函数对象超出普通函数的概念,可以有自己的状态
📖3.函数对象可以作为参数传递

代码示例:

#include<iostream>
using namespace std;
class myhanshu
{
public:
	myhanshu()
	{
		this->count = 0;
	}
	int operator()(int v1,int v2)
	{
		return v1 + v2;
	}
	void operator()(string name)
	{
		cout << name<<endl;
		count++;
	}
	int count;
};

void dowork(myhanshu d, string words)
{
	d(words);
}

void test01()
{
    //创建一个函数对象
	myhanshu MYadd;

	//1.函数对象在使用的时候可以像普通的函数那样调用,可以有自己的参数,可以有返回值
	cout<<MYadd(3, 4)<<endl;

	//函数对象超出普通函数的概念,可以有自己的状态,例如我们可以通过内置成员count统计    
       myprintf调用次数。
	myhanshu myprintf;
	myprintf("hello world");
	myprintf("hello world");
	myprintf("hello world");
	myprintf("hello world");
	cout<<"myprintf函数一共调用了" << myprintf.count<<"次" << endl;

	//类可以作为参数传递
	dowork(myprintf, "wo ai c++");


}
int main()
{
	test01();
}


运行结果:

🤔 内置函数对象:

1.算数仿函数

提供运算模板供我们使用

📖1.template<class T> T plus<T>    加法仿函数

📖2.template<class T> T minus<T>    减法仿函数  

📖3.template<class T> T multiplies<T> 乘法仿函数

📖4.template<class T> T divides<T>  除法仿函数

📖5.template<class T> T modulus<T>  取模仿函数

📖6.template<class T> T negate<T>  取反仿函数
 

这里我们只简单举两个例子,其余用法都一致

代码示例:

#include<iostream>
using namespace std;
#include<functional>
void test01()
{
	plus<int>n;//加法仿函数
	cout<<"50+40=" << n(50, 40)<<endl;

	negate<int>c;//取反仿函数
	cout << "-90的取反结果为" << c(-90);
		

}
int main()
{
 test01();
}

运行结果:

 2.关系仿函数

📖1.template<class T> bool  equal_to<T>    等于仿函数

📖2.template<class T> bool  not_equal_to<T>    不等于仿函数

📖3.template<class T> bool  greater<T>    大于

📖4.template<class T> bool  greater_equal<T>    大于等于仿函数

📖5.template<class T> bool  less<T>    小于仿函数

📖6.template<class T> bool  less_equal<T>    等于仿函数

此类仿函数常用于sort排序函数中,一般情况下我们要自定义排序就需要自己写排序规则,而如果关系仿函数满足我们的需求的话,我们直接调用关系仿函数就好了。

代码示例:

#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
void printv(vector<int >& v)
{
	for (vector<int>::iterator it = v.begin(); it != v.end(); it++)
	{
		cout << *it << " ";
	}
	cout << endl;
}
int main()
{
	vector<int> v1;
	v1.push_back(123);
	v1.push_back(232);
	v1.push_back(33);
	v1.push_back(54);
	printv(v1);
	sort(v1.begin(), v1.end(), greater<int>());
	printv(v1);
}

运行结果:


 

 其实sort函数默认的由大到小排序也是在用仿函数less达到的。

3.逻辑仿函数:

📖1. template<class T> bool logical_and<T>     逻辑与

📖2.template<class T> bool logical_or<T>         逻辑或

📖3. template<class T> bool logical_not<T>       逻辑非

逻辑仿函数属于冷门仿函数,用处比较少。

我们用一个案例来说明:要求对一个vector容器中的元素进行更换容器以及取反操作

代码示例:

#include<iostream>
using namespace std;
#include<functional>
#include<vector>
#include<algorithm>
void printv(vector<bool >& v)
{
	for (vector<bool>::iterator it = v.begin(); it != v.end(); it++)
	{
		cout << *it << " ";
	}
	cout << endl;
}
void test01()
{
	vector<bool> d1;
		
	d1.push_back(true);
	d1.push_back(false);
	d1.push_back(true);
	d1.push_back(false);
	d1.push_back(true);
	
	printv(d1);

	//我们采用逻辑运算符   逻辑非实现对vector容器中的数值取反
	
	vector<bool> d2;
	d2.resize(d1.size());

	transform(d1.begin(), d1.end(),d2.begin(), logical_not<bool>());

	printv(d2);
}
int main()
{
 test01();
}

运行结果:

🤔结束! 

 

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

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

相关文章

四轴姿态解算-imu算法

理论篇 欧拉角四元数方向余弦矩阵 强调三者描述的是坐标系A,A之间的变换关系 欧拉角&#xff0c;四元数&#xff0c;方向余弦矩阵都可以描述四轴的姿态变换 注意这里强调的是变换 三者转换公式 一阶龙格库塔法 核心要点简介: 假设一阶函数随时间关系如: y a * T1b 则,在经…

chatgpt赋能python:Python中-1的用法介绍

Python中-1的用法介绍 什么是-1&#xff1f; 在Python中&#xff0c;-1是一个特殊的索引值&#xff0c;它表示从序列的末尾开始向前数1个元素。这在对于列表、字符串、元组等序列类型进行操作时非常有用。 如何使用-1&#xff1f; 假设我们有一个列表&#xff1a; l [1, …

达梦数据库8安装教程

第一步&#xff1a;双击驱动 注意&#xff1a;如果双击显示没有驱动&#xff0c;则安装WinCDEmu软件。 第二步&#xff1a;双击setup.exe安装包 第三步&#xff1a;选择时区 第四步&#xff1a;验证key文件 因为我们是免费试用&#xff0c;所以没有key文件&#xff0c;直接下一…

14:00面试,14:06就出来了,问的问题有点变态。。。

从小厂出来&#xff0c;没想到在另一家公司又寄了。 到这家公司开始上班&#xff0c;加班是每天必不可少的&#xff0c;看在钱给的比较多的份上&#xff0c;就不太计较了。没想到5月一纸通知&#xff0c;所有人不准加班&#xff0c;加班费不仅没有了&#xff0c;薪资还要降40%,…

【第二节】变量和简单的数据类型

本节将结束python当中的变量和一部分数据类型(字符串和数字),并且介绍一些对应的方法 变量 在上一节的最后我们打印出了hello world print(hello world!)这次我们使用下面的代码实现一样的功能 message = hello world! print(message)可以看到 打印结果一模一样,而我们…

什么是IPAM?如何使用IPAM来管理IP地址和DHCP?

在计算机网络中&#xff0c;IPAM&#xff08;IP Address Management&#xff09;是一种用于管理IP地址和DHCP&#xff08;Dynamic Host Configuration Protocol&#xff09;的工具或系统。IPAM旨在简化和集中管理IP地址分配、子网划分和DHCP配置等任务。本文将详细介绍IPAM的概…

MVC 接收不到参数? —— 看我如何给你安排得明明白白

文章结构 问题背景&#xff1a;问题处理总结 问题背景&#xff1a; 现有如下代码&#xff1a; PostMapping(value "/payment/create") ResponseBody public CommonResult create(Payment payment) {}乍眼看去是不是很好&#xff0c;至少没啥问题很自然&#xff0c…

关于VUE3的一些基础知识点笔记

关于VUE3的一些基础知识点笔记 VUE3 vue2与vue3的一个重要区别是vue2是选项式API&#xff08;composition API&#xff09;而vue3是组合式API&#xff08;option API&#xff09;。 组合式API就是所有逻辑都在setup函数中&#xff0c;使用ref、watch等函数来组织代码&#xff…

使用HTTP协议在k780网站上获取天气-----天气预报

文章目录 项目介绍一、项目任务二、项目流程规划以及代码实现1.总流程2.引入库3.总体流程相关函数 三、功能函数的实现1. TCP函数2. 输入城市信息3. 查询今天天气4. 查询未来一周天气5. 查询历史天气6. 退出 总结 项目介绍 本期主要使用TCP网络编程实现天气预报的功能&#xff…

基于Html5的在线资料库的设计与实现(asp.NET,SQLServer)

在线资料库系统采用.NET开发平台进行开发&#xff0c;开发工具采用Microsoft Visual Studio 2010集成开发环境&#xff0c;后台编程语言采用C#编程语言来进行编程开发&#xff0c;数据库我们采用当下流行的SQL Server 2008数据库管理系统来存放平台中的数据信息&#xff0c;整个…

【Windows设置篇】字符集-简繁体的切换

【Windows设置篇】字符集-简繁体的切换 微软自带键盘&#xff0c;有次傻啦吧唧的一直找繁体切换简体的方法&#xff0c;进设置里面切换地区&#xff0c;更换地址也不行&#xff0c;后面才发现是在"字符集"里面切换—【蘇小沐】 文章目录 【Windows设置篇】字符集-简…

Maven jar 包下载失败问题处理【配置Maven国内源】

前言 很多同学在Maven里下载一些依赖的时候&#xff0c;即下载【jar 包】的时候总是会出现一些问题&#xff0c;这里专门做一个教程讲解一下 其实这和你的Maven配置是有关系的&#xff0c;因为Maven是一个国际站点&#xff0c;它的仓库是在国外的&#xff0c;所以我们有时候在下…

【C++】函数高级 - 默认参数,占位参数,函数重载基本语法,函数重载注意事项

No.Contents1【C】基础知识 - HelloWorld&#xff0c;注释&#xff0c;变量&#xff0c;常量&#xff0c;关键字&#xff0c;标识符2【C】数据类型 - 整型&#xff0c;sizeof&#xff0c;实型&#xff0c;字符型&#xff0c;转义字符&#xff0c;字符串类型&#xff0c;布尔类型…

chatgpt赋能python:Python中浮点数的定义

Python中浮点数的定义 什么是浮点数&#xff1f; 在计算机科学中&#xff0c;浮点数&#xff08;floating-point number&#xff09;是一种用于表示实数的近似值的数值类型。Python中的浮点数是由整数部分和小数部分组成的&#xff0c;可以使用小数点来表示。例如&#xff0c…

考研C语言第七章

7.2函数的声明定义&#xff0c;函数的分类和调用 1、函数声明要在main函数上面&#xff0c;这样main函数才可以进行调用 第一节课主要就学了函数的调用&#xff0c;项目在开发的时候分工用的比较多 主要结构&#xff1a; func.c里面进行函数的定义 不是很重要&#xff0c;进…

IDEA+Mysql+Sqlserver安装步骤_kaic

下载Intellij 开发工具&#xff0c;如果有请检查软件是否过期&#xff0c;如果过期卸载电脑上的Intellij软件。卸载步骤&#xff1a; 打开控制面板&#xff0c;选择卸载程序找到Intellij右键卸载 如果没有请保存文档中的Intellij.zip压缩包,进行安装&#xff0c;安装步骤 双…

查看 HTTP 请求的数据.

文章结构 如果是 GET 请求如果是 POST 请求方法1&#xff1a;DEBUG 窗口&#xff08;**爽、超级爽、吴迪爽**&#xff09;&#xff1a;方法2&#xff1a;写方法读取流中数据&#xff08;繁琐&#xff0c;难用&#xff09;&#xff1a; 我们可能会碰到 MVC 拿不到前端的参数&…

何时加索引,性别字段和逻辑删除字段应不应该加

首先哪些地方加索引&#xff08;按照sql执行顺序写&#xff09; 1、from表扫描连接处索引 2、where后条件去走索引 3、group by加索引 4、select查询不用加 5、order by排序加索引 &#xff08;对于第四点&#xff0c;覆盖索引&#xff1a;查询的字段都被索引覆盖&#xff0c;…

chatgpt赋能python:Python中用什么表示空格

Python中用什么表示空格 空格在编程中是一个非常重要的概念&#xff0c;特别是在Python中。Python是一门非常灵活的语言&#xff0c;空格是它语法的一个关键组成部分。今天我们将探讨的是Python中用什么表示空格。 空格是Python中的一个重要概念&#xff0c;它被用来表示代码…

spdk记录

spdk记录 hello_bdev命令行参数 往期文章&#xff1a; spdk环境搭建 hello_bdev 代码路径&#xff1a;examples/bdev/hello_world/hello_bdev.c 可执行文件路径&#xff1a;build/examples/hello_bdev 刚开始直接执行hello_bdev显示找不到Malloc0 ./build/examples/hello_b…