C++ 函数对象 详解

目录

🤔函数对象:

🤔本质:

🤔特点:

代码示例:

运行结果:

🤔 内置函数对象:

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://xiahunao.cn/news/253775.html

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

相关文章

华为OD机试真题B卷 Java 实现【字符串分隔】,附详细解题思路

一、题目描述 输入一个字符串&#xff0c;请按长度为8拆分每个输入字符串并进行输出&#xff0c;长度不是8整数倍的字符串请在后面补数字0&#xff0c;空字符串不处理。 二、输入描述 连续输入字符串(每个字符串长度小于等于100)。 三、输出描述 依次输出所有分割后的长度…

如何查看Steam的17位Id

方法/步骤 1、点击左上角Stream中的设置 2、 进入后点击“界面”&#xff0c;勾选“当可用时显示steam URL 地址栏”。 3、最后点击“查看个人资料”后17位即为ID。

steam注册模拟注册

代替手动模拟注册steam帐号

账号的注册

给账号注册&#xff0c;主要是给数据库中添加一个账号类数据&#xff0c;如图是以userName为用户名和password为密码的数据列表&#xff1a; 给用户和密码添加新的数据就是一个基础的账号注册&#xff0c;下面是页面的主要内容代码样式&#xff1a; 给相应的元素赋予name值&…

Steam注册遇到CAPTCHA问题,一直注册不了,一个简单的注册办法

这个问题一直解决不了 后来我就用了V.P.eN翻墙在Google Chrome上粘贴进入网址再注册就巨快 我自己用的一个很简洁&#xff0c;好用免费的VPeN叫白鲸 V.P.eN下载网址&#xff1a;https://www.bjch110.com/?mid1003 下载安装都很简单 然后白鲸显示连接上后&#xff0c;就打开Goo…

怎样注册邮箱账号?

邮箱账号的注册可以按照以下2种途径&#xff1a; 一、Web端注册 1、网页端搜索&#xff1a;http://163.net&#xff0c;点击“立即注册” 2、4个邮箱套餐&#xff0c;可以根据自己的使用情况进行选择 3、填写申请的邮箱账号&输入密码&#xff0c;手机号码&#xff0c;完…

Unity账号注册

Unity账号注册 文章目录 Unity账号注册 先找到Unity官网 看图: ##基本信息填入 &#xff1a; 密码格式&#xff1a; 用户名错误提示 用户名已存在: 用户名无效&#xff08;可能含有特殊字符或特殊字符串&#xff09;: ##验证信息 账号注册有两种验证方法&#xff1a;…

Steam注册到交易

Steam注册到交易 Steam注册到交易 Steam注册到交易Steam注册注册邮箱下载steam和网易UU加速注册Steam 手机令牌绑定 Steam注册 注册邮箱 163网易免费邮–中文邮箱第一品牌 申请一个你喜欢的邮箱名字和你的手机号就注册好你的邮箱啦。 下载steam和网易UU加速 大概是在这里…

IMX6ULL裸机篇之I2C相关寄存器

一. I2C实验 I2C时钟选择与传输速率 1. IMX6ULL的 I2C频率标准模式 100kbit/S&#xff0c;快速模式为 400Kbit/S 2. 时钟源选择 perclk_clk_rootipg_clk_root66MHz&#xff08;由之前的时钟实验章节可以知道是 66MHz&#xff09;。 二. I2C 寄存器配置 I2Cx_IFDR寄存器&…

使用docker和minio实现对象存储

文章目录 使用docker和minio实现对象存储什么是minio安装minio使用minio 使用docker和minio实现对象存储 什么是minio ​ Minio是一个开源的分布式文件存储系统&#xff0c;它基于 Golang 编写,虽然轻量&#xff0c;却拥有着不错的高性能&#xff0c;可以将图片、视频、音乐、…

k 折交叉验证

1. 原理步骤&#xff1a; 第一步&#xff0c;不重复抽样将原始数据随机分为 k 份。第二步&#xff0c;每一次挑选其中 1 份作为测试集&#xff0c;剩余 k-1 份作为训练集用于模型训练。第三步&#xff0c;重复第二步 k 次&#xff0c;这样每个子集都有一次机会作为测试集&…

R语言k折交叉验证

“机器学习中需要把数据分为训练集和测试集&#xff0c;因此如何划分训练集和测试集就成为影响模型效果的重要因素。最近我们被要求撰写关于k折交叉验证的研究报告&#xff0c;包括一些图形和统计输出。本文介绍一种常用的划分最优训练集和测试集的方法——k折交叉验证。” k折…

Keras入门(八)K折交叉验证

在文章Keras入门&#xff08;一&#xff09;搭建深度神经网络&#xff08;DNN&#xff09;解决多分类问题中&#xff0c;笔者介绍了如何搭建DNN模型来解决IRIS数据集的多分类问题。   本文将在此基础上介绍如何在Keras中实现K折交叉验证。 什么是K折交叉验证&#xff1f; K折…

基于R语言进行K折交叉验证

我们在建立数据模型后通常希望在外部数据验证模型的检验能力。然而当没有外部数据可以验证的时候&#xff0c;交叉验证也不失为一种方法。交叉验验证&#xff08;交叉验证&#xff0c;&#xff23;&#xff36;&#xff09;则是一种评估模型泛化能力的方法&#xff0c;广泛应用…

【机器学习】Stacking与K折交叉验证

其他机器学习系列文章见于专题&#xff1a;机器学习进阶之路——学习笔记整理&#xff0c;欢迎大家关注。 1. Stacking定义 Stacking并不是简单地对个体学习器的结果做简单逻辑处理&#xff0c;而是先从初始数据集训练出初级学习器&#xff0c;将初级学习器的输出当成特征&…

K折交叉验证实现

K折交叉验证 k折交叉验证是划分数据集的一种方式&#xff0c;特别适合少量数据集 在原始数据中划分k份&#xff0c;取1份作为测试集&#xff0c;k-1份作为训练集 最后算出平均性能值 以MINIST数据为例子 python from tensorflow import keras import numpy as np import mat…

简述k折交叉验证法

1、以二分类任务为例&#xff0c;假定数据集D包含1000个样本&#xff0c;将其划分为训练集S和测试集T&#xff0c;其中S包含800个样本&#xff0c; T包含200个样本&#xff0c;用S进行训练后&#xff0c;如果模型在T上有50个样本分类错误&#xff0c;那么模型的正确率为75% 。 …

root 密码破解(rd.break)

在Linux系统中&#xff0c;忘记root密码时&#xff0c;可以用此方法进行暴力修改root密码 示例&#xff1a; 设置一个新的记不住的密码 $ echo cnakdnvf | passwd --stdin root $ poweroff 1.启动此虚拟机&#xff0c;选中以下行&#xff0c;并按 【 e 】进入内核编辑页面 …

k折交叉验证

一般情况将K折交叉验证用于模型调优&#xff0c;找到使得模型泛化性能最优的超参值。&#xff0c;找到后&#xff0c;在全部训练集上重新训练模型&#xff0c;并使用独立测试集对模型性能做出最终评价。 K折交叉验证使用了无重复抽样技术的好处&#xff1a;每次迭代过程中每个样…

Python连接达梦数据库

python如果想连接达梦数据库&#xff0c;必须要安装dmPython。 简介&#xff1a;dmPython 是 DM 提供的依据 Python DB API version 2.0 中 API 使用规定而开发的数据库访问接口。dmPython 实现这些 API&#xff0c;使 Python 应用程序能够对 DM 数据库进行访问。 dmPython 通…