C++ 仿函数(一)

2023-10-26

目录

一、仿函数是什么?

二、仿函数的特点

1.仿函数在使用时,可以像普通函数那样调用, 可以有参数,可以有返回值

2.仿函数超出普通函数的概念,可以有自己的状态

​编辑3.仿函数可以作为参数传递。

三、谓词

一元谓词示例:

二元谓词示例:

总结

一、仿函数是什么?

        仿函数也叫函数对象,是定义了一个含有operator()成员函数的对象,可以视为一个一般的函数,只不过这个函数功能是在一个类中的运算符operator()中实现,它将函数作为参数传递的方式来使用。

二、仿函数的特点

1.仿函数在使用时,可以像普通函数那样调用, 可以有参数,可以有返回值

class MyAdd
{
public:
	int operator()(int v1, int v2)
	{
		return v1 + v2;
	}
};

//1.函数对象在使用时,可以像普通函数那样调用,可以有参数和返回值
void test01()
{
	MyAdd myAdd;
	cout << myAdd(1, 2) << endl;
}

 结果输出:3

2.仿函数超出普通函数的概念,可以有自己的状态

//2、函数对象可以有自己的状态
class MyPrint
{
public:
	MyPrint()
	{
		count = 0;
	}
	void operator()(string test)
	{
		cout << test << endl;
		count++; //统计使用次数
	}

	int count; //内部自己的状态
};
void test02()
{
	MyPrint myPrint;
	myPrint("hello world");
	myPrint("hello world");
	myPrint("hello world");
	cout << "myPrint调用次数为: " << myPrint.count << endl;
}

运行结果:


3.仿函数可以作为参数传递。

//3、函数对象可以作为参数传递
void doPrint(MyPrint& mp, string test)
{
	mp(test);
}

void test03()
{
	MyPrint myPrint;
	doPrint(myPrint, "Hello C++");
}

 运行结果:

优点:
        1.仿函数可有拥有自己的数据成员和成员变量,比一般函数灵活。
        2.仿函数比函数指针的执行速度快。
        3.仿函数可以作为模板参数使用,因为每个仿函数都拥有自己的类型。

缺点:
        1.需要单独实现一个类。
        2.定义形式比较复杂。

三、谓词

仿函数返回值类型是bool数据类型,称为谓词

如果operator接受一个参数,那么称为一元谓词;如果接受两个参数,那么称为二元谓词

一元谓词示例:

//1.一元谓词 参数中只有一个的谓词,称为一元谓词
struct GreaterFive {
	bool operator()(int val) {
		return val > 15;
	}
};

void test01() {

	vector<int> v;
	for (int i = 0; i < 10; i++)
	{
		v.push_back(i);
	}
	//查找容器中有没有大于5的数字
	//GreateFive(),匿名函数对象
	vector<int>::iterator it = find_if(v.begin(), v.end(), GreaterFive());
	if (it == v.end()) {
		cout << "没找到!" << endl;
	}
	else {
		cout << "找到:" << *it << endl;
	}

}

 因为我们设置的vector容器中的数是0-9,所以无法找到15,故输出“没找到”

二元谓词示例:

//二元谓词
class MyCompare
{
public:
	bool operator()(int num1, int num2)
	{
		return num1 > num2;
	}
};


void test02()
{
	vector<int> v;
	v.push_back(1);
	v.push_back(2);
	v.push_back(5);
	v.push_back(7);
	v.push_back(9);

	//默认从小到大
	sort(v.begin(), v.end());
	for (vector<int>::iterator it = v.begin(); it != v.end(); it++)
	{
		cout << *it << " ";
	}
	cout << endl;
	cout << "----------------------------" << endl;

	//使用函数对象改变算法策略,排序从大到小
	sort(v.begin(), v.end(), MyCompare());
	for (vector<int>::iterator it = v.begin(); it != v.end(); it++)
	{
		cout << *it << " ";
	}
	cout << endl;
}

运行结果:

 

总结

        本文让我们对仿函数有了初步的认识,知道了什么是仿函数,仿函数的优缺点还有什么是谓词。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++ 仿函数(一) 的相关文章

  • 在java程序中使用c++ Dll

    我正在尝试使用System LoadLibrary 使用我用 C 编写的一个简单的 dll UseDllInJava java import com sun jna Library import com sun jna Native imp
  • Windows 10 Mobile (10.0.14393) 地理围栏后台任务 (LocationTrigger)

    自从10 0 14393 周年纪念更新 LocationTrigger似乎不起作用 我有 Windows Phone 8 1 应用程序 也适用于 UWP 应用程序 输出到的便携式库Windows Runtime Component图书馆 w
  • System.IO.IOException:由于意外>数据包格式,握手失败?

    有谁知道这意味着什么 System Net WebException 底层连接已关闭 发送时发生意外错误 gt System IO IOException 由于意外 握手失败 数据包格式 在 System Net Security SslS
  • 如何尝试/捕获所有异常

    我正在完成由其他人启动的 UWP 应用程序 该应用程序经常崩溃 我总是陷入困境应用程序 at if global System Diagnostics Debugger IsAttached global System Diagnostic
  • C# 正则表达式用于查找 中具有特定结尾的链接

    我需要一个正则表达式模式来查找字符串 带有 HTML 代码 中的链接 以获取文件结尾如 gif 或 png 的链接 示例字符串 a href site com folder picture png target blank picture
  • 如何创建用于 QML 的通用对象模型?

    我想知道是否有任何宏或方法如何将 Qt 模型注册为 QObject 的属性 例如 我有AnimalModel http doc qt io qt 5 qtquick modelviewsdata cppmodels html qabstra
  • 劫持系统调用

    我正在编写一个内核模块 我需要劫持 包装一些系统调用 我正在暴力破解 sys call table 地址 并使用 cr0 来禁用 启用页面保护 到目前为止一切顺利 一旦完成 我将公开整个代码 因此如果有人愿意 我可以更新这个问题 无论如何
  • 将带有 glut 的点击坐标添加到向量链接列表中

    我想创建一个向量链接列表 并在 GLUT 库的帮助下获取点击的位置并将它们附加到链接列表中 这些是我写的结构 typedef struct vector int x int y Vector typedef struct VectorLis
  • 从成员函数指针类型生成函子

    我正在尝试简化 通过make fn 预处理参数的函子的生成 通过wrap 对于 arity 的成员函数n 生成函子基本上可以工作 但到目前为止只能通过显式指定成员函数的参数类型来实现 现在我想从它处理的成员函数类型生成正确的函子 struc
  • OpenCV 2.4.3 中的阴影去除

    我正在使用 OpenCV 2 4 3 最新版本 使用内置的视频流检测前景GMG http docs opencv org modules gpu doc video html highlight gmg gpu 3a 3aGMG GPU算法
  • C# 中的常量和只读? [复制]

    这个问题在这里已经有答案了 可能的重复 const 和 readonly 之间有什么区别 https stackoverflow com questions 55984 what is the difference between cons
  • tabcontrol selectedindex 更改事件未被触发 C#

    嘿伙计们 我有一个很小的问题 请参阅下面的代码 this is main load private void Form1 Load object sender EventArgs e tabAddRemoveOperator Selecte
  • .NET 客户端中 Google 表格中的条件格式请求

    我知道如何在 Google Sheets API 中对值和其他格式进行批量电子表格更新请求 但条件格式似乎有所不同 我已正确设置请求 AddConditionalFormatRuleRequest formatRequest new Add
  • WPF。如何从另一个窗口隐藏/显示主窗口

    我有两个窗口 MainWindow 和 Login 显示登录的按钮位于主窗口 this Hide Login li new Login li Show 登录窗口上有一个检查密码的按钮 如果密码正确 我如何显示主窗口 将参数传递给 MainW
  • DataTable:通过 LINQ 或 LAMBDA 进行动态 Group By 表达式

    我有一个数据表 我想在其中对未指定数量的字段进行分组 发生这种情况的原因是用户可以选择他想要分组的字段 所以 实际上 我将选择推入列表中 在这个选择上 我必须对我的数据表进行分组 想象一下这段代码 VB 或 C 都一样 public voi
  • 使用 iTextSharp 5.3.3 和 USB 令牌签署 PDF

    我是 iTextSharp 和 StackOverFlow 的新手 我正在尝试使用外部 USB 令牌在 C 中签署 PDF 我尝试使用从互联网上挖掘的以下代码 Org BouncyCastle X509 X509CertificatePar
  • 从 Delphi 调用 C# dll

    我用单一方法编写了 Net 3 5 dll 由Delphi exe调用 不幸的是它不起作用 步骤 1 使用以下代码创建 C 3 5 dll public class MyDllClass public static int MyDllMet
  • C语言声明数组没有初始大小

    编写一个程序来操纵温度详细信息 如下所示 输入要计算的天数 主功能 输入摄氏度温度 输入功能 将温度从摄氏度转换为华氏度 独立功能 查找华氏度的平均温度 我怎样才能在没有数组初始大小的情况下制作这个程序 include
  • OSError: [WinError 193] %1 不是有效的 Win32 应用程序,同时使用 CTypes 在 python 中读取自定义 DLL

    我正在尝试编写用 python 封装 C 库的代码 我计划使用 CTypes 来完成此操作 并使用 Visual Studio 来编译我的 DLL 我从一个简单的函数开始 在 Visual Studio 内的标头中添加了以下内容 然后将其构
  • 如何使用 C# 以低分辨率形式提供高分辨率图像

    尝试使用 300dpi tif 图像在网络上显示 目前 当用户上传图像时 我正在动态创建缩略图 如果创建的页面引用宽度为 500x500px 的高分辨率图像 我可以使用相同的功能即时转换为 gif jpg 吗 将创建的 jpg 的即将分辨率

随机推荐

  • JAVA抠图证件照,大头照更换背景或透明

    本文是基础版 使用算法实现请查看 http t csdn cn U8Y4C 使用hutool包 maven引入
  • 道德经学习202220820

    第一章 道可道 非常道 名可名 非常名 无 名天地之始 有 名万物之母 故常无 欲以观其妙 常有 欲以观其徼 jiao 此两者 同出而异名 同谓之玄 玄之又玄 众妙之门 能用言语说出来的道 都不是永恒的终极的道 能形容出来的名都不是永恒的终
  • 22年新款MacBookAir屏幕解析

    先说结论 搭载M2芯片的AIR 很值得买 屏幕 Liquid视网膜显示屏 像素 2550 1664 亮度 500nit 色域 P3 技术 原彩显示技术 Liquid是液晶的意思 但在这里 Liquid是圆角的意思 可以这么说 搭载M2芯片的
  • 【设计模式】-监听者模式和观察者模式的区别与联系

    前言 监听者模式和观察者模式在平时开发中或在Spring源码中经常有碰到 两者乍看上去好像差不多 但为何会分为两种不同的设计模式 究竟是人性的扭曲还是道德的沦丧 让我们一起走进本篇 深入解析两者的异同和使用场景 目录 1 介绍 1 1监听者
  • 数据隐私、AI 交互和知识管理:DB-GPT 的综合解决方案

    python telegram bot python telegram bot Stars 22 9k License GPL 3 0 这个项目是一个提供纯 Python 异步接口的 Telegram Bot API 库 它与 Python
  • extern声明外部结构体

    结构体是一种类型 定义一种类型最好是在 h文件定义 这样其他地方想用这个结构体 只需包含此 h文件即可 但是定义结构体变量的话 最好载 c文件定义 为了防止重复定义 所以不建议在 h文件中定义变量 然后 h里面extern声明 其他 c文件
  • 1 恢复MySQL误删数据

    作者 一个人的孤独自白 cnblogs com mrl p 9959365 html 相信后端研发的同学在开发过程经常会遇到产品临时修改线上数据的需求 如果手法很稳那么很庆幸可以很快完成任务 很不幸某一天突然手一抖把表里的数据修改错误或者误
  • 利用OpenLayers创建wkt字符串

    var polygon OpenLayers Geometry Polygon createRegularPolygon new OpenLayers Geometry Point 6 49 2 18 0 var feature new O
  • blob (Binary Large Object)

    在深度学习中 二进制大对象 Binary Large Object BLOB 通常指的是存储模型权重或预训练模型的文件 这些文件可以非常大 通常以二进制格式存储 并在深度学习框架中用于加载和保存模型 在深度学习中 模型的权重是模型在训练过程
  • recyclerView的滑动

    1 无感知滑动 layoutManager scrollToPositionWithOffset int position int offset 第一个参数是指第几项 第二个参数是跟顶部的距离 当你的屏幕只能显示10项就满了 但是你的dat
  • 数组以及指针数组遍历&Demo

    遍历数组以及指针数组 Demo By C include
  • 【以太坊开发】 问题 etherbase must be explicitly specified

    1 使用geth启动在私有链环境下 提示如下问题 html view plain copy Updated mining threads threads 0 INFO 08 17 21 31 30 Transaction pool pric
  • flutter pubspec添加依赖无法获取flutter_test

    pubspec yaml 文件初次添加的时候拷过来没格式化 packages get 一直失败各种尝试无果 后来格式化了一下 就可以了
  • 【rust】

    系列文章目录 rust 00 开发环境搭建 rust 01 编译并运行第一个rust程序 rust 02 语法基础 变量 不可变 和常量 rust 03 语法基础 数据类型 rust 04 语法基础 函数 rust 05 语法基础 流程控制
  • windows下启动nacos(单机配置)

    windows下启动nacos 下载nacos 找到github地址 并根据对应的版本进行下载 如果下载过慢的话 可以使用迅雷下载 1下载完成后 进行解压 之后打开 conf application properties文件 2 打开后 我
  • 机器学习实战——朴素贝叶斯

    目录 一 朴素贝叶斯理论 1 概述 2 朴素贝叶斯特点 3 贝叶斯决策理论 4 条件概率与全概率公式 5 贝叶斯推断 二 朴素贝叶斯分类器应用 拉普拉斯修正 三 垃圾邮件分类 一 朴素贝叶斯理论 1 概述 朴素贝叶斯算法是有监督的学习算法
  • vue3.0模板

    GitHub Mstian Vue Onepiece Admin vue3 elementPlus后台管理简单模板https github com Mstian Vue Onepiece Admin
  • null,default关键字

    一 null关键字 1 null是空的意思 在表中 默认情况下 所有的字段值都可以为空 1 建表期间 可以对某一字段进行非空约束 not null 在insert时 此字段必须要有数据 create table temo id number
  • libuv之基础

    TCP客户端连接步骤 连接方法 Uv loop t loop uv default loop uv tcp t client malloc uv connect t connect req malloc uv tcp init loop c
  • C++ 仿函数(一)

    目录 一 仿函数是什么 二 仿函数的特点 1 仿函数在使用时 可以像普通函数那样调用 可以有参数 可以有返回值 2 仿函数超出普通函数的概念 可以有自己的状态 编辑3 仿函数可以作为参数传递 三 谓词 一元谓词示例 二元谓词示例 总结 一