functor 是什么?
在阅读Tensorflowy源码时看到了这个,后来明白这是个命名空间,但查了一下原来functor并不简单,以后很可能会用到,特此转载记下。
下面是转载的作者原文:
引子
有一次在美团面试的时候,第二轮面试官问道:“听说过functor吗?”,妈呀,6年了,竟然没听说过这个概念,今天就学习了一会,哎,天不遂人愿,老天弄人啊,其实这个东西我们大家都不止一次的在使用它。举个例子(注意for_each的第三个参数):
- // for_each example
- #include <iostream> // std::cout
- #include <algorithm> // std::for_each
- #include <vector> // std::vector
- void myfunction (int i) { // function:
- std::cout << ' ' << i;
- }
- struct myclass { // function object type:
- void operator() (int i) {std::cout << ' ' << i;}
- } myobject;
- int main () {
- std::vector<int> myvector;
- myvector.push_back(10);
- myvector.push_back(20);
- myvector.push_back(30);
- std::cout << "myvector contains:";
- for_each (myvector.begin(), myvector.end(), myfunction);
- std::cout << '\n';
- // or:
- std::cout << "myvector contains:";
- for_each (myvector.begin(), myvector.end(), myobject);
- std::cout << '\n';
- return 0;
- }
是的,这就是functor的思想。
补充一下functor的实现(各个人实现可能不一样哦,不同的库,不同的语言也可能不一样哦),仅供参考:
- template<class InputIterator, class Function>
- Function for_each(InputIterator first, InputIterator last, Function fn)
- {
- while (first!=last) {
- fn (*first);
- ++first;
- }
- return fn; // or, since C++11: return move(fn);
- }
什么是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倍。