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倍。


  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
函数式编程中的 `Maybe`, `Either`, `Functor` 和 `Monad` 是常见的一些概念。 `Maybe` 表示一个可能为空的值,它可以用来避免程序中的空指针异常。在 Haskell 中,`Maybe` 是一个数据类型,它有两个值:`Just a` 表示存在一个值,值为 `a`;`Nothing` 表示不存在值。在其他语言中,可以通过自定义一个 `Maybe` 类型来实现类似的功能。 `Either` 表示一个值可能是两种类型中的一种。在 Haskell 中,`Either` 是一个数据类型,它有两个参数:`Either a b` 表示值可以是类型 `a` 或 `b` 中的一种。在其他语言中,可以通过自定义一个 `Either` 类型来实现类似的功能。 `Functor` 是一个抽象概念,它表示一个能够被映射(map)的数据结构。在 Haskell 中,`Functor` 是一个类型类,它要求实现一个 `fmap` 函数,它可以将一个函数作用于一个 Functor 上。在其他语言中,可以通过实现一个 `map` 函数来实现类似的功能。 `Monad` 是一个用于处理副作用的抽象概念。在函数式编程中,副作用是指函数执行过程中对程序状态进行修改,比如 I/O 操作、异常处理等。为了避免副作用对程序的影响,函数式编程中引入了 Monad 的概念。Monad 要求实现一个 `bind` 函数,它可以将一个 Monad 的值传递给一个函数,并返回一个新的 Monad。在 Haskell 中,`Monad` 是一个类型类,它要求实现 `return` 和 `>>=` 函数。在其他语言中,可以通过自定义一个 Monad 类型来实现类似的功能。 综上所述,`Maybe`, `Either`, `Functor` 和 `Monad` 都是函数式编程中常见的一些概念,它们可以帮助程序员编写更加健壮、可维护的代码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值