仿函数

【C++】仿函数的概念 仿函数(Functor)又称为函数对象(Function Object)是一个能行使函数功能的类。仿函数的语法几乎和我们普通的函数调用一样,不过作为仿函数的类,都必须重载 operator() 运算符。因为调用仿函数,实际上就是通过类对象调用重载后的 operator() 运算符。如果编程者要将某种“操作”当做算法的参数,一般有两种方法:(1)一个办法就是先将该“操作”设计为一个函数,再将函数指针当做算法的一个参数。上面的实例就是该做法; 阅读详情

       所有的仿函数定义在头文件<functional>中。

1.定义及分析

       仿函数就是一个定义了operator()的对象。

class X 
{
public:
//define "function call" operator
return-value operator() (arguments) const;
...
};
//现在这个类对象就可以当做函数一样使用
X fo;
...
fo(arg1, arg2); //call operator () for function object fo
//等同于
fo.operator() (arg1,arg2); //调用对象fo的operator()

凡是行为像函数,那么这个对象就是函数。仿函数就是这个意思,但是STL中为什么要用仿函数而不直接用函数呢?

       首先STL是一个有自己规则的框架,函数指针无法和STL其他组件搭配(配接器),产生更灵活的变化:

       仿函数应当有能力被函数配接器修饰,然后彼此合作形成一个整体。为了可配接仿函数需要定义自己的相应型别(和迭代器的型别的作用是一个含义)。由于STL只使用一元和二元仿函数,所以定义了两个class:unaru_function和binary_function。这两个类没有成员,只有一些型别定义。任何仿函数,只要依个人需求选择继承其中一个class,便自动拥有了那些相应型别,也就自动拥有了配接能力。

       其次仿函数相对于函数指针有其自身优点:

1、 仿函数是智能型函数

       就好比智能指针的行为像指针,其就可看作是一个指针。但是智能指针是定义的一个类对象,所以在具备指针功能的同时也有其他的能力。仿函数的能力也可以超越operator()。因为仿函数可以拥有成员函数和成员变量,这意味着仿函数拥有状态。另一个好处是可以在执行期初始化它们。

class AddValue 
{
private:
	int theValue; //the value to add
public:
	AddValue(int v) : theValue(v) {}
	void operator() (int& elem) const 
	{
		elem += theValue;
	}
};
AddValue addx (x); //+x
AddValue addy (y); //+y
AddValue(10))//常量
AddValue (*coll. begin())//变量

2、 仿函数都有自己的型别

       这就是泛型编程编写仿函数。

3、 仿函数通常比一般函数快

       就template的概念而言,由于更多细节在编译器就已确定,所以通常可能进行更好的最佳化。

2.预定义的仿函数

2.1算术类

       除了否定为一元,其他都为二元仿函数。

加法:plus<T>

减法:minus<T>

乘法:multiplies<T>

除法:divides<T>

求余:modulus<T>

否定:negate<T>

2.2关系运算类

       都是二元仿函数。

等于:equal_to<T>

不等于:not_equal_to<T>

大于:greater<T>

大于等于:greater_equal<T>

小于:less<T>

小于等于:less_equal<T>

2.3逻辑运算类

       与和或为二元仿函数,否为一元仿函数。

与:logical_and<T>

或:logical_or<T>

否:logical_not<T>

 

3.仿函数配接器

       仿函数配接器是配接器(仿函数、容器、迭代器)中最大的一部分。主要运用到的如以下所示:

绑定第一个参数为定值:bind1st(op,x)——效果op(x,param)

绑定第二个参数为定值:bind2nd(op,x)——效果op(param,x)

对一元仿函数逻辑取反:not1(op)——效果!op(param)

对二元仿函数逻辑取反:not2(op)——效果!op(param1,param2)

SGI版本特有的还有compose1和compose2,就是组合函数的意思:

compose1(op1,op2)——效果op1(op2())

       举例:

判定元素不小于12:bind2nd(greater_equal<int>(),12)或者not1(bind2nd(less<int>(),12))

对元素x执行(x+2)*3:compose1(bind2nd(multiplies<int>,3),bind2nd(plus<int>(),2))

      

       另外的函数配接器就是针对成员函数而设计的函数配接器:

mem_fun_ref(op)                 调用op,是某对象的一个const成员函数

men_fun(op)                        调用op,是某对象指针的一个const成员函数

注意,被men_fun_ref和men_fun调用的成员函数必须是const,C++标准库暂时不支持non-const成员函数提供函数配接器。

class Person 
{
	private:
	std::string name;
	public:
	...
	void print() const 
	{
	std::cout << name << std::endl;
	}
	void printWithPrefix (std::string prefix) const 
	{
		std::cout << prefix << name << std::endl;
	}
};
void foo (const std::vector<Person>& coll)
{
	using std::for_each;
	using std::bind2nd;
	using std::mem_fun_ref;
//对各个元素调用成员函数print
	for_each (coll.begin(), coll.end(),mem_fun_ref(&Person::print));
//对各个元素调用成员函数printWithPrefix
//-"person: "是传递的一个参数,所以使用了bind2nd
for_each (coll.begin(), coll.end(),bind2nd (mem_fun_ref (&Person::printWithPrefix),"person: "));
}




《QEMU/KVM源码分析与应用》读书笔记1 —— 第1章 QEMU与KVM概述 《QEMU/KVM源码分析与应用》学习笔记1 —— 第一章 QEMU与KVM概述 阅读详情

相关推荐

BK7238(XH-WB3S)固件烧录实战:从AT固件选择到稳定下载全解析

本文详细解析了BK7238(XH-WB3S)模组固件烧录的全过程,从AT固件版本选择到稳定下载的实战技巧。重点介绍了烧录前的准备工作、硬件连接的正确姿势、烧录软件的实战技巧以及疑难问题排查指南,帮助开发者高效完成BK7238模组的固件烧录。

weixin_29159441的博客 246

什么是仿函数?

使用对象调用成员函数、使用指向对象的指针调用成员函数和使用指向对象的引用调用成员函数都是调用非静态成员函数的方式,而使用类名调用成员函数只能调用静态成员函数。此外,如果成员函数是虚函数,则使用对象调用成员函数、使用指向对象的指针调用成员函数和使用指向对象的引用调用成员函数会动态绑定(即在运行时根据对象的实际类型来调用相应的虚函数),而使用类名调用成员函数不会进行动态绑定。当我们将一个重载了运算符 "()" 的函数定义为类的成员函数,并且将该类的一个实例称为仿函数对象时,这个函数就具备了仿函数的特征。

weixin_43623488的博客 5201

HSmartWindowControl vs HWindowControl:Halcon老鸟教你如何根据项目需求选对控件(附性能对比)

本文深度对比Halcon图像处理中的HSmartWindowControl与HWindowControl控件,从性能、内存占用和交互体验等维度提供选型建议。HSmartWindowControl在硬件加速渲染、智能内存管理方面表现优异,特别适合医疗影像和工业检测等高性能需求场景,而HWindowControl则更适合兼容旧系统和资源受限环境。

weixin_30765505的博客 468

STL --- 六. 仿函数 Functors

介绍仿函数,仿函数如何使用的,仿函数和函数对象的区别

bigger_belief的博客 3125

手把手教你为STM32设备生成自定义MAC地址(基于芯片ID的5种算法对比)

本文详细介绍了基于STM32芯片ID生成自定义MAC地址的5种算法,包括直接截取、异或折叠、CRC32哈希、自定义混合运算及SHA-256摘要。通过对比分析各算法的计算复杂度、唯一性及适用场景,帮助嵌入式开发者根据项目规模与资源,选择最合适的方案,确保设备MAC地址的唯一性与合规性。

weixin_29170327的博客 526

RK3568笔记十七:LVGL v8.2移植

若该文为原创文章,转载请注明原文出处。本文介绍嵌入式图形库移植到Linux开发板ATK-RK3568上的步骤。

4229

仿函数(functors)

functor(仿函数), 或者称之为function object(函数对象), 是STL的四大组件之一。 什么是仿函数呢?  一个函数对象是封装在类中, 从而看起来更像是一个对象。 这个类只有一个成员函数, 即重载了() (括号)的运算符。 它没有任何数据。 该类被模板化了, 从而可以应付多种数据类型。 看一个例子: 上例中, 我们定义了一个类X, 然后我们在类中定义了一个运算

a130737的专栏 1万+

Unity之Hololens2开发MRTK Profile详解

配置 MRTK 的主要方式之一是使用基础包中的配置文件。场景中的主要对象具有活动配置文件 - 一个 ScriptableObject。顶级 MRTK 配置配置文件包含主核心系统的每个核心的子配置文件数据,每个主核心系统都旨在配置其相应子系统的行为。此外,这些子配置文件也是 ScriptableObjects,因此可以包含对低它们一级的其他配置文件对象的引用。实质上,有一个包含已连接配置文件的完整树,这些配置文件构成了如何初始化 MRTK 子系统和功能的配置信息。

TxNet 1032

探索仿函数(Functor):C++中的灵活函数对象

仿函数(Functor)是一种行为类似函数的对象,它可以被用作函数并接受参数。在C++中,仿函数通常是重载了函数调用运算符operator()的类对象。通过重载operator(),仿函数可以像函数一样被调用,并且可以保存状态信息。按照操作数划分:假定某个类有一个重载的operator(),而且重载的operator()要求获取一个参数,我们就将这个类称为一元仿函数(unary functor);如果重载的operator()要求获取两个参数,就将这个类称为二元仿函数(binary functor)。

无敌岩雀的博客 3097

军品研制过程评审活动-(一)论证阶段

军品研制过程评审活动-(一)论证阶段

Abel的博客 3814

手把手教你学Simulink——整流器场景:基于PWM控制的单相全桥整流器设计

摘要:本文详细介绍了使用Simulink搭建基于PWM控制的单相全桥整流器的完整设计流程。主要内容包括:系统结构设计(含交流电源、全桥整流器、滤波电路等模块)、分步骤建模过程(从创建项目到添加各功能模块)、双闭环控制系统设计(电压外环和电流内环PI控制)、参数设置建议及仿真分析。通过仿真验证,该整流器可实现单位功率因数运行和稳定输出电压,并提供了数字锁相环等优化方向。文章为电力电子系统设计提供了实用的Simulink建模指导。(149字)

MHD0815的博客 324

【C++】关于仿函数

关于仿函数的概念,仿函数的应用灵活性,仿函数的使用场景,仿函数的性能

m0_74195626的博客 6665

【AI智能体】Claude Code +Superpowers 项目实战操作详解

Claude Code +Superpowers 项目实战操作详解

congge 4043

C++之仿函数

最近再看STL源码的时候看到里面的实现用了大量的仿函数,然后上网搜集了一些关于仿函数的知识。 仿函数(Functor)又称为函数对象(Function Object)是一个能行使函数功能的类。仿函数的语法几乎和我们普通的函数调用一样,不过作为仿函数的类,都必须重载 operator() 运算符。因为调用仿函数,实际上就是通过类对象调用重载后的 operator() 运算符。 如果编程者要将某种...

Cold_Sun_的博客 5559

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

STL仿函数

仿函数functors另名函数对象functions objects。在之前的算法介绍中,我们已经用到了仿函数。此章,我们对仿函数做一个更详细的介绍。

chnming1987的博客 1045

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

【C++】仿函数

仿函数(Functors)是一个在编程中常用的术语,特别是在面向对象编程和函数式编程中。它主要用于描述一个对象,这个对象表现得像函数一样,可以像调用函数一样使用。简单来说,仿函数是可以被调用的对象。在面向对象编程中,仿函数是通过重载函数调用运算符 operator() 实现的。一个仿函数对象的行为就像一个函数,尽管它本质上是一个类的实例。例如,在C++中,我们可以通过重载 operator() 来实现仿函数。

GGDxianv的博客 755

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

【C++ 十九】STL-函数对象(仿函数)、一元谓词、二元谓词、算术仿函数、关系仿函数、逻辑仿函数

本文包含函数对象概念、函数对象使用、谓词概念、 一元谓词、 二元谓词、内建函数对象意义、算术仿函数(plus()、minus()、multiplies()、divides()、modulus()、negate())、关系仿函数(equal_to()、not_equal_to()、greater()、greater_equal()、less()、less_equal())、逻辑仿函数(logical_and()、logical_or()、logical_not())。

qq_45138120的博客 2768

STL之仿函数实现详解

1、何为仿函数 仿函数的主要功能是为了搭配STL算法使用,单独使用仿函数的情况比较少。 仿函数(functors)在C++标准中采用的名称是函数对象(function objects)。仿函数主要用于STL中的算法中,虽然函数指针虽然也可以作为算法的参数,但是函数指针不能满足STL对抽象性的要求,也不能满足软件积木的要求–函数指针无法和STL其他组件搭配,产生更灵活变化。仿函数本质就是类重载了...

一个菜鸟的博客 2万+

C++仿函数

仿函数(functor),就是使一个类的使用看上去像一个函数。其实现就是类中实现一个。(),这个类就有了类似函数的行为,就是一个仿函数类。

qq_63976098的博客 5199

C++中的仿函数

在C++中,仿函数(Functors)或称为函数对象(Function Objects)是重载了调用操作符operator()的类或结构体,这使得这些类的对象可以像函数一样被调用。仿函数的主要用途是提供一种灵活的方式来定义和操作数据。通过创建自定义的仿函数,你可以将待定的逻辑封装在一个对象中,并在需要时将其传递给算法或容器。本文主要介绍了 C++ 中的仿函数,包括仿函数的定义、特性和相对性能优势。

逃离世界····· 1244

STL源码剖析:仿函数

可以当函数使用的对象,一个类或结构体,重载圆括号操作符 "()",可以像函数一样被调用。仿函数对象可以当成参数传入函数中。

_ 907

c++仿函数的应用

首先介绍一个简单的例子 问题描述: struct stRecordItem { char szname[_MAX_NAME_LEN_]; //物品名称 int dwBaseID; //基本ID  int btItemLvl; //品阶 int ncount; //数量 __int64 i64Time; //记录这条信息的时间,如果有叠加的,按后一个的时间 }; list Lis

lbqBraveheart的专栏 5497
上一篇: 迭代器适配器
下一篇: 二叉树遍历(递归与迭代)
sicofield
博客等级 码龄18年 169粉丝 169原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值