STL函数对象及函数对象适配器

C++基础4:函数适配器 函数适配器技术可以在不修改源代码的基础上,增加函数的功能。是对面向对象开闭原则的体现。在C++ STL中就是用了大量的函数适配器,比如not1。} }我们定义了一个仿函数类,该类很简单,就是把传入的flag,直接返回。opt(flag);} }该适配器的功能是在原有功能的基础上,取反。以上就是今天要讲的内容,函数适配器是STL很重要的一部分,遍历集合函数中的条件语句,用到了很多的函数适配器。 阅读详情
一 函数对象Functor

  STL中提供了一元和二元函数的两种Functor,通过unary_function和binary_function提供了这两种不同参数数量的Functor的基本结构,在这两个类型中,分别内嵌定义一元和二元函数操作在模版推演的时候需要用到的typedef.
 

//一元函数的定义为
template<class _A, class _R>
struct unary_function {
 typedef _A argument_type;
 typedef _R result_type;
};


//二元函数的定义为
template<class _A1, class _A2, class _R>
 struct binary_function {
 typedef _A1 first_argument_type;
 typedef _A2 second_argument_type;
 typedef _R result_type;
};


其他的一元和二元Functor可以从这两个基本结构继承,同时也就可以推演出函数的参数和返回值的类型,STL在上述这两个结构的基础上,实现了很多一元和二元的Functor.

//一元
negate

//二元
plus
minus
multiplies
divides
modulus
equal_to
not_equal_to
greater
greater_equal  
less
less_equal
logical_and
logical_or
logical_not

上面的这些Functor都是基于模版实现的,可以象下面那样使用的方式:

plus<int> int_plus;
cout << int_plus(111,222) << endl;



二 函数对象适配器

函数对象适配器的作用就是使函数转化为函数对象,或是将多参数的函数对象转化为少参数的函数对象。


1)bind

bind1st //通过绑定第一个参数,使二元的函数对象转化为一元的函数对象
bind2nd //通过绑定第二个参数,使二元的函数对象转化为一元的函数对象
not1 //对一元的函数对象取反
not2 //对二元的函数对象取反

使用的方式:
bind1st( less<int>(), 10)(20);
not2( less<int() )(10,20);

这些Functor看起来好像好像用处不大,但是在和STL中的容器和算法结合在一起使用的时候,就会使得程序显得很简洁.

int i;   
vector<int> lv;
for(i = 0; i < 100; i++)  
{
  lv.push_back(i);
}
//对vector中小于20的数进行记数
cout << count_if(lv.begin(), lv.end(), bind2nd(less<int>(), 20)) << endl;

//由大到小排序
sort(lv.begin(), lv.end(), not2(less<int>()) ) ;
for (i = 0; i < 100; i++)  
{
  cout << lv.at(i) << endl;
}



2)ptr_fun

ptr_fun是指将现有的函数转换为Functor的功能.在STL中提供了这个功能的Functor,就是pointer_to_unary_function和pointer_to_binary_function这两个类,这两个类对应一元

和二元两种函数,也就是说,对于调用参数为3个或者多于3个的函数,STL提供的Functor类,无法配接.

基本使用方法:

int u_func(int a)
{
  int ret = a;
  return ret;
}   

int b_func(int a,int b)
{
  return a+b;
}

void call()
{
 pointer_to_unary_function<int,int> uf(u_func);
  cout << uf(100) << endl;
    
  pointer_to_binary_function<int,int,int> bf(b_func);
  cout << bf(111,222) << endl;

 //或者
 cout << ptr_fun(u_func)(100) << endl;
  cout << ptr_fun(b_func)(111,222) << endl;

}


可以看到,上面的方法改进了原先C和C++中通过函数指针来间接调用函数的方法,将函数指针封装到了类中.


问题:

第一部分中的Functor中是自己定义操作符(),但是在ptr_fun中,是将已经有的function转为Functor调用就会存在一个调用方式的问题.

c++中的函数,按调用方式可以分为__cdecl, __stdcall,__fastcall 三种,ptr_fun如何正确的识别给定的function的调用方式就会有问题.

其中:
vc6中的STL的ptr_fun代码中,统一将function认为是__cdecl调用方式. 而Dev-cpp中使用的SGI的代码中没有明确指明函数的调用方式,所以将使用编译器的确省设置.
但是如果将上面的b_func函数改为
int __stdcall b_func(int a,int b)
{
  return a+b;
}


上面的使用代码在DEV-CPP中无法编译通过.

3)mem_fun

mem_fun是将某个类中的成员函数转变为Functor的功能.  

一般的使用方法
struct mem_fun_struct
{
  int n_mem_fun() {
  cout << "mem_fun_struct::n_mem_fun()" << endl;
  return 0;
  }   
    
  int u_mem_fun(int a) {
  cout << "mem_fun_struct::u_mem_fun(int) " << a << endl;
  return a;
  }   
    
  int b_mem_fun(int a,int b) {
  cout << "mem_fun_struct::b_mem_fun(int,int)" << a << " " << b << endl;
  return a+b;
  }   
};

void call()
{
 mem_fun_struct ls;
  mem_fun(&mem_fun_struct::n_mem_fun)(&ls);
  mem_fun(&mem_fun_struct::u_mem_fun)(&ls, 10);
  //mem_fun(&mem_fun_struct::u_mem_fun)(&ls, 10, 20);
}



上面的代码在dev-cpp 4.9.9中编译通过,SGI STL中没有提供二元成员函数的mem_fun,vc6中提供了mem_fun(无参数成员函数)和mem_fun1(一元参数成员函数), 而在vs2003中改变了用法.但是我看MSDN好像也只支持到一个参数.

三 总结

STL中提供了基本的一元和二元参数的Functor, 同时提供了相应的适配器可以对Functor进行修饰,Functor可以很好的和 STL容器,STL算法结合使用.

但是仍有问题:
1)上面说到的调用方式
2) 多参数函数对象适配

对于我们比较复杂的stl不能满足要求的问题,我们可以是用boost或loki来解决。
手教你如何使用Simulink和相关工具箱模拟和实现无人机的多机接力信号中继的建模 扩大通信范围:单架无人机的通信能力有限,通过多机接力的方式可以显著扩展通信覆盖范围。提高可靠性:当某架无人机出现故障或电量不足时,其他无人机可以接管其任务,确保通信不中断。适应复杂环境:在山区、森林等复杂地形中,多机接力可以绕过障碍物,建立稳定的通信链路。使用Communications Toolbox中的模块来模拟无线通信链路。例如,可以使用模块模拟噪声信道,或者使用模块计算信号衰减。matlab深色版本。 阅读详情

相关推荐

[渗透测试实战篇-4] RCE漏洞组合拳突破Getshell全解析

本文深入解析RCE漏洞组合拳在渗透测试中的实战应用,通过SSRF、XXE等漏洞串联技术突破Getshell的全过程。文章详细介绍了Java和PHP环境下的漏洞利用差异,以及防御绕过与权限维持的实用技巧,为安全研究人员提供全面的实战指导。

weixin_29211309的博客 351

【代码分析】初学解惑C++:函数适配器

我们定义了一个仿函数类,该类很简单,就是把传入的flag,直接返回。该适配器的功能是在原有功能的基础上,取反。protected:public://重载了括号,所以RealTrueAdaptorNot(arg),arg的值给了opt(x)的x,又传给了flagreturn!opt(flag);只要类继承了my_unary_function类,就可以被下面的AdaptorNot适配。

啊枫 654

第三课 NXP S32K144 MCAL 集成到Vector davinci SIP-第一弹

将NXP S32K144 MCAL 集成到Vector davinci SIP的第三方库,导出ARXMl给Vector davinci SIP使用

candleer的博客 5857

函数适配器

函数适配器1)函数适配器     2)常用函数适配器标准库提供一组函数适配器,用来特殊化或者扩展一元和二元函数对象。常用适配器是:1绑定器(binder): binder通过把二元函数对象的一个实参绑定到一个特殊的值上,将其转换成一元函数对象。C++标准库提供两种预定义的binder适配器:bind1st和bind2nd,前者把值绑定到二元函数对象的第一个实参上,后者绑定在第二个实参上。2取反器(...

ukston_C的博客 897

SAP财务模块必看:BAPI_ACC_DOCUMENT_POST扩展字段全攻略(含FIBF配置)

本文详细解析了SAP财务模块中如何利用BAPI_ACC_DOCUMENT_POST的EXTENSION1参数扩展自定义字段。文章从需求分析入手,对比了传统增强与BTE(业务交易事件)两种技术路径,并重点提供了基于FIBF配置的完整实战指南,包括数据结构理解、函数模块开发及配置步骤,帮助ABAP开发者和财务顾问高效、可维护地实现如WBS元素、税务代码等字段的灵活传递。

weixin_29290963的博客 396

SAP ABAP 四种传统的数据库视图类型介绍之二:Projection View

一是该 projection view 只暴露了底层 TADIR 表的四个字段,因此通过该 view 维护数据,在维护界面我们只能维护一条记录的四个字段,如下图所示。使用 Projection view 的优点在于其设计灵活性:如果系统中原始的数据库表字段较多,通过投影仅保留关键信息可有效降低从数据库层到应用层之间的数据传输负担,且保持数据的一致性。其二是笔者之前的文章提到,TADIR 是 ABAP 系统重要的对象注册表,如同 window 操作系统的注册表一样,一般的应用开发人员不应该去修改其内容。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 1441

C++函数适配器和函数包装器:让你的函数更灵活

C++函数适配器和函数包装器:让你的函数更灵活

热爱编程的小K的博客 2178

微信小程序 - 详细实现可移动悬浮按钮,全屏悬浮元素图标可拖动拖拽并自动吸附边缘,微信小程序实现悬浮球吸附边缘+计算靠边靠拢效果(详细代码,拖拽中途放手,靠左就自动跑到屏幕左侧,反之靠右跑到屏幕右侧)

微信小程序,vue2,vue3,微信小程序悬浮功能小按钮,自动吸附边缘效果,微信小程序之可拖动悬浮按钮的实现,如何实现靠近边缘自动吸住功能,小程序右下角的悬浮效果,实现可拖动悬浮图标,自动向两边靠拢,悬浮按钮的实现,微信小程序悬浮球效果,微信小程序(可拖动悬浮按钮)当靠近屏幕边缘时会磁吸靠近,如何实现全局悬浮按钮,悬浮球判断吸附在左右,全屏悬浮能拖着走,小程序怎么做悬浮图标靠近左右两侧能吸附住,悬浮菜单按钮,悬浮球可拖拽,全局悬浮球,全局悬浮框,实现悬浮按钮可拖动,自动吸附边缘效果,若按钮此时位于页面中间偏

🏆 前端领域优质创作者 1万+

【C++】STL 算法 ⑩ ( 函数适配器 | 函数适配器概念 | 函数适配器分类 | 函数适配器辅助函数 | std::bind2nd 函数原型及示例 | std::bind 函数原型及示例 )

一、函数适配器简介 1、函数适配器概念 2、函数适配器分类 3、函数适配器辅助函数 二、函数适配器使用示例 - std::bind2nd 函数 1、std::bind2nd 函数原型 2、代码示例 - std::bind2nd 函数 三、函数适配器使用示例 - std::bind 函数 1、std::bind 函数原型 2、代码示例 - std::bind 函数

让 学习 成为一种 习惯 ( 韩曙亮 の 技术博客 ) 2874

HTML爱心字母雨(完整代码)

HTML语言实现爱心字母雨的完整代码。

AIGC 2万+

SAP Gateway Foundation OData V4 服务管理深度解析,从 Service Repository 到 Service Group 的完整运行逻辑

本文解析了SAP S/4HANA中OData V4 API的技术架构,重点阐述Service Repository、Service与Service Group的三层管理体系。以SalesOrder和PurchaseOrder API为例,说明不同服务可能属于特定repository(如srvd_a2x)而非默认DEFAULT库。Service Group作为业务模型组合单元,支持跨服务引用和统一配置,其发布状态直接影响服务可用性。文中对比了后台管理事务/IWBEP/V4_ADMIN与网关端/IWFND/V4

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 90

STL之函数对象适配器

STL之函数对象适配器1.函数适配器2. 取反适配器3. 函数指针适配器4. 成员函数适配器 1.函数适配器 现在我有这个需求:在遍历容器的时候,我希望将容器中的值全部加上100之后显示出来,怎么做? 在不需要加100的时候,只打印,很好实现: class MyPrint{ public: void operator()(int v) { cout <<v << endl; } }; void test01(){ vector<int>v; for (int

kuanyew的博客 323

扰动观察法MPPT控制器simulink仿真

最大功率点跟踪(MPPT)控制器对于光伏(PV)系统至关重要,因为它可以确保系统在所有操作条件下都能从光伏阵列中提取最大功率。扰动观察法(P&O)是一种广泛使用的MPPT算法,因为它简单且易于实现。本文介绍了P&O MPPT控制器的Simulink仿真,并分析了其性能。

qq_59747472的博客 318

STL函数对象(仿函数)与函数适配器

1、函数对象(仿函数) 函数对象是c++中一种行为类似函数的对象,对它可以像调用函数一样使用。 函数对象是泛化的函数,是重载了“()”运算符的类的对象。 主要作用是作为STL算法的参数,为算法提供更细化的操作。 使用STL的函数对象,需要包含头文件 <functional>。 例如一个比较大小的仿函数: template<typename T> struct comp { ...

qq_38236355的博客 313

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

C++ STL 之 函数对象适配器

谓词是指普通函数或重载的 operator()返回值是 bool 类型的函数对象(仿函数)。如果operator 接受一个参数,那么叫做一元谓词,如果接受两个参数,那么叫做二元谓词,谓词可作为一个判断式。例如: struct myfuncobj01 {   bool operator(int v){} // 接受一个参数,并且返回值为 Bool 即一元谓词 } bool c...

weixin_30618985的博客 197

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

STL函数对象 内建函数 函数对象适配器

函数对象函数对象的概念谓词概念内建函数对象函数对象适配器 函数对象的概念 重载函数调用操作符的类,其对象常称为函数对象(function object),即它们是行 为类似函数的对象,也叫仿函数(functor),其实就是重载“()”操作符,使得类对象可以像函 数那样调用。 注意: 1.函数对象(仿函数)是一个类,不是一个函数。 2.函数对象(仿函数)重载了”() ”操作符使得它可以像函数一样调用。 一元仿函数”(unary functor):重载的 operator()要求获取一个参数; 二元仿函数”(b

log_Li的博客 174

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

C++学习:六个月从基础到就业——STL:函数对象与适配器

函数对象是一个实现了函数调用运算符(operator())的类或结构体的实例。由于它可以像函数一样被调用,因此也被称为仿函数。// 基本函数对象示例int value;// 函数调用运算符// 使用函数对象// 等同于调用addFive.operator()(10)// 输出:10 + 5 = 15// 创建临时函数对象并立即调用// 输出:7 + 3 = 10return 0;STL在头文件中提供了一系列的预定义函数对象,这些函数对象执行常见的算术、比较和逻辑操作。

qq_53773901的博客 1175

STL中的预定义函数对象和函数适配器

预定义函数对象:STL模板库中封装的函数 函数适配器: 对于STL中的有些算法,其输入参数有些限制(比如参数个数等),因此需要用到函数适配器将参数适配成适合算法的输入,这个是我个人的理解。 #include <iostream> #include "string" #include <vector> #include <list> #include "set...

一路向北 349

STL(内建函数对象,函数对象适配器 )

4.3 内建函数对象 STL内建了一些函数对象。分为:算数类函数对象,关系运算类函数对象,逻辑运算类仿函数。这些仿函数所产生的对象,用法和一般函数完全相同,当然我们还可以产生无名的临时对象来履行函数功能。使用内建函数对象,需要引入头文件 #include<functional>。 6个算数类函数对象,除了negate是一元运算,其他都是二元运算。 template&l...

塞外听雪 444

STL之仿函数、谓词、内建函数对象、适配器、常用算法

​ 简述: 了解STL之仿函数、谓词、、内建函数对象、适配器、常用算法归纳等,书写一个简单地例子。 文章目录本博文的简述or解决问题?函数对象/谓词/内建函数对象/适配器:大纲如图:函数对象:谓词:内建函数对象:代码演示:运行结果:常用算法:大纲如图:知识点讲解: 编程环境: win10 x64 专业版 编程软件: visual studio 2015, Qt 5.9.8 本博文的简述o...

696

C++ STL(十一):适配器(函数对象适配器、取反适配器、函数指针适配器、成员函数适配器)

文章目录1 函数对象适配器 1 函数对象适配器 作用:修饰函数对象/仿函数,提供适配功能。 问题案例: 使用for_each算法和函数对象/仿函数遍历容器的元素时: ①若希望原容器元素经某种运算(如与给定值100进行加法运算)后,再输出运算结果; ②给定值可作为operator()函数的参数传递(如由用户键盘输入,而非在operator()函数体内使用固定值100); ③for_each(iterator begin, iterator end, _Fn _Func)函数只支持3个参数,且第3个参数需传入

NewsomTech 1279

STL算法 ——函数对象(仿函数)【仿函数、谓词、内建函数对象、适配器】

/ x op value,即 10 greater elem,10 > elem,小于10的元素。// x op value,即 10 less elem,10 < elem,大于10的元素。// value op x,即 elem less 10,elem < 10,小于10的元素。//sort(v.begin(), v.end())//默认升序,如想要降序,就要增加排序规则。他们的申明是一样的,都是(const Operation& op, const T& x);greater();...

程序员,他们想的是什么?他们想的永远都是技术,他们崇尚的也永远都是技术。 484

C++STL 预定义函数对象和函数适配器

预定义函数对象和函数适配器 预定义函数对象基本概念:标准模板库STL提前定义了很多预定义函数对象,#include <functional>必须包含。 1使用预定义函数对象: void main() { plus<int> intAdd; int x = 10; int y = 20; int z = intAdd(x, y); /...

Huadong_eddy的博客 384

8.21C++:函数对象、STL提供的函数对象、函数适配器

1 函数对象 函数对象是行为类似函数的对象。一个类对象,表现出一个函数的特征,即通过对象名+(参数列表)的方式使用一个类对象。 使用STL中提供的或自定义的迭代器和**函数对象,**配合STL的算法,组合出各种各样的功能。 通过函数对象而不使用函数指针,可以增加通用性,提高效率。为什么使用函数对象 函数对象概念:泛化的函数 ①将普通函数作为函数对象:传递函数名 #include <iostream> #include <numeric> //包含accumulate算法 #in

weixin_44478659的博客 313
上一篇: C++ 智能指针
下一篇: C++ system函数用法
seadplus
博客等级 码龄15年 57粉丝 61原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值