STL中的仿函数
2015-05-16 17:31
302 查看
http://blog.csdn.net/kangroger/article/details/38681383
仿函数(functors)在C++标准中采用的名称是函数对象(function objects)。仿函数主要用于STL中的算法中,虽然函数指针虽然也可以作为算法的参数,但是函数指针不能满足STL对抽象性的要求,也不能满足软件积木的要求--函数指针无法和STL其他组件搭配,产生更灵活变化。
仿函数本质就是类重载了一个operator(),创建一个行为类似函数的对象。例如下面就是一个仿函数的例
[cpp] view
plaincopy
struct plus{
int operator()(const int& x, const int& y) const { return x + y; }
};
然后就可以如下这样使用
[cpp] view
plaincopy
int a=1, b=2;
cout<<plus(a,b);
这样其实创建了一个临时无名的对象,之后调用其重载函数()。
但是STL中的仿函数不是这个样子的,为了使仿函数拥有被函数配接其(function adapter)修饰,彼此像积木一样地串接。仿函数应该定义自己相应的类别(associative types)。就像迭代器一样,为了融入STL,必须定义自己的5个相应类别。这样做的目的是为了让配接器能够取出,获得反函数的某些信息。相应类别都是一下typedef定义的预处理,在编译时就完成了替代,对程序执行效率没有影响,也不带来任何额外的负担。
仿函数相应的类别主要用来表现函数参数类型和返回值类型。在<stl_function.h>定义了两个struct,分别代表一元仿函数和二元仿函数。
[cpp] view
plaincopy
// C++ Standard 规定,每一個 Adaptable Unary Function 都必须继承此类别
template <class Arg, class Result>
struct unary_function {
typedef Arg argument_type;
typedef Result result_type;
};
// C++ Standard 規定,每一個 Adaptable Binary Function 都必须继承此类别
template <class Arg1, class Arg2, class Result>
struct binary_function {
typedef Arg1 first_argument_type;
typedef Arg2 second_argument_type;
typedef Result result_type;
};
仿函数按照运算来分类,有以下3类:
1)算术类仿函数
加:plus<T>
减:minus<T>
乘:multiplies<T>
除:divides<T>
模取:modulus<T>
否定:negate<T>
2)关系运算类仿函数
等于:equal_to<T>
不等于:not_equal_to<T>
大于:greater<T>
大于等于:greater_equal<T>
小于:less<T>
小于等于:less_equal<T>
3)逻辑运算仿函数
逻辑与:logical_and<T>
逻辑或:logical_or<T>
逻辑否:logical_no<T>
仿函数(functors)在C++标准中采用的名称是函数对象(function objects)。仿函数主要用于STL中的算法中,虽然函数指针虽然也可以作为算法的参数,但是函数指针不能满足STL对抽象性的要求,也不能满足软件积木的要求--函数指针无法和STL其他组件搭配,产生更灵活变化。
仿函数本质就是类重载了一个operator(),创建一个行为类似函数的对象。例如下面就是一个仿函数的例
[cpp] view
plaincopy
struct plus{
int operator()(const int& x, const int& y) const { return x + y; }
};
然后就可以如下这样使用
[cpp] view
plaincopy
int a=1, b=2;
cout<<plus(a,b);
这样其实创建了一个临时无名的对象,之后调用其重载函数()。
但是STL中的仿函数不是这个样子的,为了使仿函数拥有被函数配接其(function adapter)修饰,彼此像积木一样地串接。仿函数应该定义自己相应的类别(associative types)。就像迭代器一样,为了融入STL,必须定义自己的5个相应类别。这样做的目的是为了让配接器能够取出,获得反函数的某些信息。相应类别都是一下typedef定义的预处理,在编译时就完成了替代,对程序执行效率没有影响,也不带来任何额外的负担。
仿函数相应的类别主要用来表现函数参数类型和返回值类型。在<stl_function.h>定义了两个struct,分别代表一元仿函数和二元仿函数。
[cpp] view
plaincopy
// C++ Standard 规定,每一個 Adaptable Unary Function 都必须继承此类别
template <class Arg, class Result>
struct unary_function {
typedef Arg argument_type;
typedef Result result_type;
};
// C++ Standard 規定,每一個 Adaptable Binary Function 都必须继承此类别
template <class Arg1, class Arg2, class Result>
struct binary_function {
typedef Arg1 first_argument_type;
typedef Arg2 second_argument_type;
typedef Result result_type;
};
仿函数按照运算来分类,有以下3类:
1)算术类仿函数
加:plus<T>
减:minus<T>
乘:multiplies<T>
除:divides<T>
模取:modulus<T>
否定:negate<T>
2)关系运算类仿函数
等于:equal_to<T>
不等于:not_equal_to<T>
大于:greater<T>
大于等于:greater_equal<T>
小于:less<T>
小于等于:less_equal<T>
3)逻辑运算仿函数
逻辑与:logical_and<T>
逻辑或:logical_or<T>
逻辑否:logical_no<T>
相关文章推荐
- [STL系列]仿函数
- 仿函数(二、stl中常用仿函数)
- C++STL:仿函数
- C++STL学习(9)仿函数(function objects, functor)
- STL源码学习——仿函数和配接器
- 仿函数, 函数适配器,与STL算法的配合使用
- 【C++ STL】深入解析神秘的 --- 仿函数
- STL_5: 仿函数
- STL中的仿函数
- STL源码剖析----算法、仿函数、配接器
- 数据结构与C++stl(2) 仿函数
- STL笔记(2)——仿函数、自增/减操作符等简介
- STL之仿函数,适配器简介
- STL之仿函数
- STL —— for_each与仿函数、函数指针
- (Boolan) C++ STL与泛型编程——算法、仿函数、Adapter
- STL中仿函数(functors)、类成员和mem_fun的使用
- &lt;Effective STL&gt;笔记--仿函数
- STL中仿函数(functors)、类成员和mem_fun的使用
- STL之仿函数