8 STL仿函数(函数对象)
来源:互联网 发布:阿里云学生机认证 编辑:程序博客网 时间:2024/05/01 12:40
8 STL仿函数(函数对象)
8.1 仿函数特性
重载operator()。
拥有状态;每个仿函数都有其型别(type);速度比函数指针快。
仿函数都是pass by value,好处是可以传递常量和临时表达式(如传递Sequence(1)),缺点是无法存取和改变其最终状态。
解决方法:(1)以by refrerence的方式传递仿函数(通过将模板参数显示标示); (2)运用for_each()算法的返回值。
for_each()可以返回其仿函数:
如MeanValue mv = for_each(coll.begin(), coll.end(), MeanValue()); //假设MeanValue为函数对象,即仿函数
注意:不应该传递一个“行为取决于被拷贝次数或被调用次数”的仿函数(因为算法有时会复制一个副本),也就是说判断式(返回布尔值的一个函数或仿函数)不应该因为被调用而改变自身状态。解决方法:将对应operator()声明为const成员函数。
8.2 预定义的仿函数——<functional>
1、函数配接器(function adapter)——能够将仿函数和另一个仿函数(或某个值)结合起来的仿函数
bind1st(op, value); //op(value, param)bind2st(op, value); //op(param,value)not1(op); //!op(param)not2(op); //!op(param1, param2)
2、常成员函数的函数配接器(此版本不支持non-const成员函数)
如for_each(coll.begin(), coll.end(), mem_fun_ref(&Person::print); //print()为Person类中的常成员函数(无参数),我们不能直接传递成员函数
for_each(coll.begin(), coll.end(), bind2nd(mem_fun_ref(&Person::printWithPrefix), "Person:")); //printWithPrefix()有一个参数
区别:mem_fun()要求coll的元素是Person*(指针),而mem_fun_ref要求coll的元素是Person对象。
3、针对一般函数(非成员函数)的函数配接器
使用ptr_fun将普通函数(1、2个参数, 如果有多个参数, 要改用boost::bind)适配成bind1st或bind2nd能够使用的functor,否则对bind1st或bind2nd直接绑定普通函数,则编译出错。
ptr_fun(op) ; //op(param)或op(param1, param2)
如pos = find_if(coll.begin(), coll.end(), not1(ptr_fun(check))); //check为一般函数
4、让自定义仿函数也可以使用函数配接器
必须提供一些型别成员来反映其参数和返回值的型别。可以让自定义仿函数继承自struct unary_function或struct binary_function。
8.3 辅助用(组合型)仿函数
- 8 STL仿函数(函数对象)
- STL---函数对象(仿函数)概述
- [STL]函数对象/仿函数
- [STL]函数对象/仿函数
- stl 仿函数(函数对象)
- STL源码剖析——仿函数(函数对象)
- 仿函数(函数对象)和STL算法
- 仿函数(函数对象)
- C++ STL 基础及应用(7) 函数对象(仿函数)
- STL仿函数
- 【STL】仿函数细节
- STL仿函数
- STL仿函数functor
- c++ STL仿函数
- stl--仿函数
- stl仿函数
- stl--仿函数
- c++ STL仿函数
- 浮动div的通用css样
- DevBytes: KeyFrame Animations
- ARM指令集 LDR指令
- 将文件内容加载到i一个元素里面
- 【Python】Python十进制转二进制,可指定位数
- 8 STL仿函数(函数对象)
- Uva 12299 线段树求区间最小值(RMQ) 区间查询单点更新
- JEDIS
- 设计模式之代理模式(Proxy)
- 学习交流群
- SVM入门(七)为何需要核函数
- 351A Jeff and Rounding
- hdu 4308 - Saving Princess claire_
- Android学习笔记之AndroidManifest.xml文件解析