仿函数(函数对象),仿函数也称为函数数符。
仿函数的英文:FunctionObjects,即函数对象。
仿函数是将函数作为参数传递的使用方式,例如:逻辑谓词,算术运算,抽取信息等。
仿函数的概述
仿函数是定义了一个operator()的对象。仿函数可以视为一般函数,仿函数在其成员函数operator()中实现的。
3个优点:
1 仿函数比一般函数更灵巧,主要是因为仿函数拥有状态(state).
对于仿函数,可以拥有两个状态不同的实体。通常的普通函数是不能实现该目的的。
2 每个仿函数都有其型别。因此仿函数的型别可以作为模板参数,实现指定某种行为的目的。
容器型别不会和具体仿函数有关,而仅仅是该型别的仿函数均可以使用。
3 仿函数要比函数指针的执行速度快得多。在C++规范中,函数调用通常使用指针,
当需要调用函数时,只需要函数的地址(名称)即可。
地址调用的缺陷效率非常低,为提高效率需要使用仿函数的形式。
定义的仿函数被调用时,是使用运算符operator()的。
通过对运算符自定义,能显著提高效率。
仿函数均是以类似函数的形式被调用的。仿函数均包含成员函数operator(),这是仿函数的共同点。
仿函数的基类:
template<class _A,class _R>
struct unary_function
{
typedef _A Argument_Type;
typedef _R Result_Type;
};
和
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 生成器,是不用参数就可以调用的仿函数(即无参数仿函数)
2 一元函数,是用一个参数就可以调用的仿函数
3 二元函数,是用两个参数才可以调用的仿函数
对于for_each(),其调用的仿函数就应该是一元函数
仿函数4种使用形式
1 作为排序规则
2 拥有内部状态
3 算法for_each()的返回值
4 作为判断式