functor functor 是什么?

functor 是什么?
在阅读Tensorflowy源码时看到了这个,后来明白这是个命名空间,但查了一下原来functor并不简单,以后很可能会用到,特此转载记下。
下面是转载的作者原文:

引子

有一次在美团面试的时候,第二轮面试官问道:“听说过functor吗?”,妈呀,6年了,竟然没听说过这个概念,今天就学习了一会,哎,天不遂人愿,老天弄人啊,其实这个东西我们大家都不止一次的在使用它。举个例子(注意for_each的第三个参数):

[cpp]  view plain  copy
  1. // for_each example  
  2. #include <iostream>     // std::cout  
  3. #include <algorithm>    // std::for_each  
  4. #include <vector>       // std::vector  
  5.   
  6. void myfunction (int i) {  // function:  
  7.     std::cout << ' ' << i;  
  8. }  
  9.   
  10. struct myclass {           // function object type:  
  11.     void operator() (int i) {std::cout << ' ' << i;}  
  12. } myobject;  
  13.   
  14. int main () {  
  15.     std::vector<int> myvector;  
  16.     myvector.push_back(10);  
  17.     myvector.push_back(20);  
  18.     myvector.push_back(30);  
  19.       
  20.     std::cout << "myvector contains:";  
  21.     for_each (myvector.begin(), myvector.end(), myfunction);  
  22.     std::cout << '\n';  
  23.       
  24.     // or:  
  25.     std::cout << "myvector contains:";  
  26.     for_each (myvector.begin(), myvector.end(), myobject);  
  27.     std::cout << '\n';  
  28.       
  29.     return 0;  
  30. }  

是的,这就是functor的思想。

补充一下functor的实现(各个人实现可能不一样哦,不同的库,不同的语言也可能不一样哦),仅供参考:

[cpp]  view plain  copy
  1. template<class InputIterator, class Function>  
  2.   Function for_each(InputIterator first, InputIterator last, Function fn)  
  3. {  
  4.   while (first!=last) {  
  5.     fn (*first);  
  6.     ++first;  
  7.   }  
  8.   return fn;      // or, since C++11: return move(fn);  
  9. }  

什么是functor?

 functor的英文解释为something that performs a function,即其行为类似函数的东西。C++中的仿函数是通过在类中重载()运算符实现,使你可以像使用函数一样来创建类的对象。

为什么使用仿函数(functor)

  • 迭代和计算逻辑分离

    使用仿函数可以使迭代和计算分离开来。因而你的functor可以应用于不同场合,在STL的算法中就大量使用了functor.

  • 参数可设置

    可以很容易通过给仿函数(functor)设置参数,来实现原本函数指针才能实现的功能.

  • 有状态

    与普通函数另一个区别是仿函数(functor)是有状态的.

  • 性能

    我们看一下代码:

1
std::transform(in.begin(), in.end(), out.begin(), add_x(1));

    编译器可以准确知道std::transform需要调用哪个函数(add_x::operator)。这意味着它可以内联这个函数调用。而如果使用函数指针,编译器不能直接确定指针指向的函数,而这必须在程序运行时才能得到并调用。

    一个例子就是比较std::sort 和qsort ,STL的版本一般要快5-10倍。


猜你喜欢

转载自blog.csdn.net/tiankongtiankong01/article/details/80419650