SGI STL functors(仿函数) 12

仿函数(函数对象)大概介绍


函数对象,即”行为类似函数”的对象,重载function call运算子(operator ())。
STL仿函数与STL算法间关系
STL仿函数根据操作数个数划分,可分为一元和二元仿函数,按功能划分可分为算数运算、关系运算、逻辑运算三大类。
使用内建仿函数需包含<functional>头文件。

仿函数可配接的关键


为了拥有配接能力,需要依照规定定义自己的5个相应型别。仿函数的相应型别主要用来表现函数参数型别和传回值型别。
为了方便期间,<stl_function.h>定义了两个class,分别表示一元仿函数和二元仿函数(STL不支持三元仿函数),其中只有型别定义,没有成员函数和成员变量。任何仿函数只需要根据需求继承其中一个class即可拥有相应型别,也就自动拥有了配接能力。

unary_function

unary_function用来呈现一元仿函数的参数型别和返回值型别。

1
2
3
4
5
template <class _Arg, class _Result>
struct unary_function {
typedef _Arg argument_type;
typedef _Result result_type;
};

binary_function

binary_function用来呈现二元函数的第一参数型别、第二参数型别、返回值型别。

1
2
3
4
5
6
template <class _Arg1, class _Arg2, class _Result>
struct binary_function {
typedef _Arg1 first_argument_type;
typedef _Arg2 second_argument_type;
typedef _Result result_type;
};

binder1st配接器用于将某个二元仿函数转化为一元仿函数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
template <class _Operation>
class binder1st
: public unary_function<typename _Operation::second_argument_type,
typename _Operation::result_type> {
protected:
_Operation op;
typename _Operation::first_argument_type value;
public:
binder1st(const _Operation& __x,
const typename _Operation::first_argument_type& __y)
: op(__x), value(__y) {}
typename _Operation::result_type
operator()(const typename _Operation::second_argument_type& __x) const {
return op(value, __x);
}
};

算数仿函数


STL内建算数仿函数支持加、减、乘、除、求余、否定运算。除了否定运算其它均为二元运算。

  • 加:plus<T>
  • 减:minus<T>
  • 乘:multiplies<T>
  • 除:divides<T>
  • 求余:modulus<T>
  • 否定:negate<T>

关系运算类仿函数


STL内建关系运算符仿函数支持等于、不等于、大于、大于等于、小于、小于等于六类。每一个都是二元源算。

  • 等于:equal_to<T>
  • 不等于:not_equal_to<T>
  • 大于:greater<T>
  • 大于等于:greater_equal<T>
  • 小于:less<T>
  • 小于等于:less_equal<T>

逻辑运算符仿函数


STL内建的逻辑运算符仿函数支持And、Or、Not三种,And和Or为二元运算符,Not为一元运算符。

  • And:logical_and<T>
  • Or:logical_or<T>
  • Not:logical_not<T>

功能极其简单的仿函数都是为了搭配STL算法。