functor的英文解释为something that performs a function,即其行为相似函数的东西。C++中的仿函数是经过在类中重载()运算符实现,使你能够像使用函数同样来建立类的对象。算法
// this is a functor struct add_x { add_x(int x) : x(x) {} int operator()(int y) { return x + y; } private: int x; }; // usage: add_x add42(42); // create an instance of the functor class int i = add42(8); // and "call" it assert(i == 50); // and it added 42 to its argument std::vector<int> in; // assume this contains a bunch of values) std::vector<int> out; // Pass a functor to std::transform, which calls the functor on every element // in the input sequence, and stores the result to the output sequence std::transform(in.begin(), in.end(), out.begin(), add_x(1)); assert(out[i] == in[i] + 1); // for all i
迭代和计算逻辑分离函数
使用仿函数可使迭代和计算分离开来。于是你的functor能够应用于不一样场合,在STL的算法中就大量使用了functor,下面是STL中for_each中使用functor的示例:
性能
struct sum { sum(int * t):total(t){}; int * total; void operator()(int element) { *total+=element; } }; int main() { int total = 0; sum s(&total); int arr[] = {0, 1, 2, 3, 4, 5}; std::for_each(arr, arr+6, s); cout << total << endl; // prints total = 15; }
参数可设置this
能够很容易经过给仿函数(functor)设置参数,来实现本来函数指针才能实现的功能,看下面代码:spa
class CalculateAverageOfPowers { public: CalculateAverageOfPowers(float p) : acc(0), n(0), p(p) {} void operator() (float x) { acc += pow(x, p); n++; } float getAverage() const { return acc / n; } private: float acc; int n; float p; };
这个仿函数的功能是求给定值平方或立方运算的平均值。只须要这样来声明一个对象便可:指针
CalculateAverageOfPowers my_cal(2);
有状态
code
与普通函数另外一个区别是仿函数(functor)是有状态的,因此能够进行诸以下面这种操做:
orm
CalculateAverage avg; avg = std::for_each(dataA.begin(), dataA.end(), avg); avg = std::for_each(dataB.begin(), dataB.end(), avg); avg = std::for_each(dataC.begin(), dataC.end(), avg);
对多个不一样的数据集进行取平均。对象
性能
element
咱们看一下2中写的代码:
std::transform(in.begin(), in.end(), out.begin(), add_x(1));
编译器能够准确知道std::transform须要调用哪一个函数(add_x::operator)。这意味着它能够内联这个函数调用。而若是使用函数指针,编译器不能直接肯定指针指向的函数,而这必须在程序运行时才能获得并调用。
一个例子就是比较std::sort 和qsort ,STL的版本通常要快5-10倍。
总结
固然,前3点均可以使用传统的函数和指针实现,可是用仿函数(functor)可让这种实现变的更加简单。