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来解决。
(Linux)DHCP 超级作用域和中继代理(超难受做了超久) DHCP服务器在192.168.159.0 可以实现分配IP的功能,现在要跨网段分配IP 就需要用到DHCP中继代理。中继代理有两张网卡分别eth0:IP 192.168.159.2 ;eth1: IP:192.168.200.2 。现在要实现192.168.200.0网段的客户机可以获取DHCP服务器的IP。中继代理其实是相当于一个路由器的作用 DHCP服务器的IP地址 :192.168.159... 阅读详情

相关推荐

2022年电赛E题声源定位跟踪系统

电赛声源定位

qq_53357019的博客 2万+

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

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

啊枫 654

从零到一:YT8512C PHY芯片在STM32F407上的LWIP移植实战与避坑指南

本文详细介绍了YT8512C PHY芯片在STM32F407平台上基于LWIP协议栈的移植实战,涵盖硬件连接、CubeMX配置、寄存器定制和调试技巧。重点解析了与主流PHY芯片的差异,提供了完整的避坑指南和优化建议,帮助开发者快速实现稳定可靠的嵌入式网络连接。

uber9的博客 538

函数适配器

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

ukston_C的博客 897

使用R语言实战:构建Logistic回归模型

Logistic回归是一种基于概率的分类算法,它用于预测离散的结果变量(也称为响应变量或因变量)。与线性回归不同,Logistic回归的输出是一个概率值,通常在0和1之间。这使得它非常适合处理二分类问题。市场营销:预测客户是否会购买某个产品。医学研究:预测疾病的发生与否。信用风险评估:预测个人申请贷款的违约风险。社会科学:预测个人对某个政策的态度。

2301_79331230的博客 1140

上机任务一:空气质量指数 (air quality index,AQI是定量描述空气质量状况的指数。为了更好地了解和人们身体健康息息相关的天气状况,本书模拟生成500条某地区天气数据,一行样本对应一天

调整后的R平方为0.4308,考虑了模型中的自由度,它略低于多重R平方,说明模型的解释能力可能有限。总的来说,新的模型相对于之前的模型在AIC值上更优,包含了最高温度(X2)和最低温度(X3)这两个重要的预测因子,并且对AQI的解释能力较好。在表中,Df表示自由度,Sum Sq表示总平方和,Mean Sq表示均方(总平方和除以自由度),F value表示F统计量,Pr(>F)表示对应的p值。在分析这些结果时,需要关注系数的显著性(p值),系数的方向(正向或负向影响),以及系数的大小(估计值)。

Mrrunsen的博客 723

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

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

热爱编程的小K的博客 2178

总结个人关于雷达样式的见解(脉内脉间调制)

概述 雷达有各种各样的脉内脉间调制样式,对于雷达的设计者来说,不外乎三个目的: 1、增加雷达性能,如提高测距精度,增大侦察距离等; 2、雷达的工作机制决定雷达必须采用此种样式的调制,如有些SAR雷达为保证径向测距精度,需要使用脉内宽带调制信号; 3、降低雷达被电子战装备截获的概率,也就是LPI设计。 对于雷达对抗方,则只会观察到信号存在脉内及脉间的调制。对于一般的雷达信号,通常只采用脉内调制,脉间频率调制,脉间PRI调制。 脉间调制类型 1、PD雷达的脉间特征 雷达进行脉间调制的主要是PRI..

年糕的博客 3万+

【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

循迹小车控制实验:代码集成与硬件验证

在main.c文件中还需定义上层代码调用的GPIO输入和PWM输出相关函数,其中调用STM32CubeMX生成的HAL库函数。}else{}else{}else{}else{在main.h文件中的USER CODE BEGIN EFP注释代码段中外部声明Get函数和Set函数,使该函数可以被上层代码调用。循迹小车控制实验到本章全部完成。相比于前几章节的实验,本实验复杂程度是最高的。

u013288925的博客 127

Sigrity OptimizePI Best Capacitor Location Estimation模式如何评估电容最佳位置操作指导

Sigrity OptimizePI Best Capacitor Location Estimation模式用于前仿真分析,评估电容的最佳位置以获得最小回路电感,如何分析,以下图为例进行说明。IC devices,输入U*, A*, B*, Q*, P*,将所有这些字母开头的器件都识别为IC。Min设置为1(最少电容个数为1),max设置为28(最多电容个数为28)Capacitors 输入C*,将所有C开头的器件都识别为电容。Grid X设置为8,Grid Y也设置为8。

weixin_54787054的博客 382

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

2026年高教社杯数学建模国赛A题解题思路:从物理方程推导到MATLAB高效求解的全流程实战指南

□所有代码能够从头运行到尾,不报错(清除workspace重新跑一遍)□论文中的每个图号、表号、公式编号与正文引用一致□附录中附上核心代码(注意:不是全部代码,而是关键求解器和后处理部分)□支撑材料压缩包包含完整代码、数据文件、README说明□摘要字数严格控制在1000字以内,突出创新点和核心结果□。

YOLO 110

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

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

qq_38236355的博客 313

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

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

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

weixin_30618985的博客 197

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

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

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

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

log_Li的博客 174

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

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

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

qq_53773901的博客 1174

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、付费专栏及课程。

余额充值