前言
本节将分析STL六部分之一的仿函数, 在前面分析容器以及算法的时候都有使用过仿函数, 在算法中我们还自定义过仿函数(函数对象), 就是使用struct
或者class
重载运算符, 就是行为类似于函数的对象.
-
根据仿函数的操作数可分为 : 一元和二元仿函数.
-
根据功能可分为 : 算术运算, 关系运算, 逻辑运算.
仿函数与函数指针
STL采用对象重载操作实现函数行为并没有直接定义函数指针来代替仿函数, 主要有几点原因让STL选择仿函数
- 函数指针不能满足STL的抽象性
- 函数指针不能与STL的其他组件搭配, 不够灵活
- 仿函数具有可配接性, 可以满足
traits
编程, 也是能在编译期间就能完成, 不会有运行时的开销
仿函数分析
一元仿函数
一元仿函数基类(unary_function)
template <class Arg, class Result>
struct unary_function {
typedef Arg argument_type; // 参数类型别名
typedef Result result_type; // 返回值类型别名
};
二元仿函数
二元仿函数基类(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; // 返回值类型别名
};
算术运算
每个仿函数都继承了二元仿函数, 仿函数可以通过继承使STL更灵活, 函数指针无法这样灵活的操作
-
加法
template <class T> struct plus : public binary_function<T, T, T> { T operator()(const T& x, const T& y) const { return x + y; } };
-
乘法
template <class T> struct multiplies : public binary_function<T, T, T> { T operator()(const T& x, const T& y) const { return x * y; } };
-
除法
template <class T> struct divides : public binary_function<T, T, T>