Can I fly high in the Sky?

Never say never.

导航

[STL系列]仿函数

Posted on 2015-08-22 14:31  lsr_flying  阅读(157)  评论(0编辑  收藏  举报

仿函数,即函数对象,就是一个对象的operator()方法。

形如:

class FunctionObjectType
{
public:
void operator() () {
    /* statements */
}
}

它具有如下优点:

1)可以拥有状态信息,即每个对象都可以记录不同的状态;

2)每个仿函数可以拥有其类型,可把仿函数类型当作template的参数传递;

3)执行速度比函数指针快。

 

例子:

1)每个对象内部可以记录不同的状态,本例内部状态为int value,可以看到,初始化不同的仿函数,可以在运行过程中根据不同的内部状态产生不同结果。

class functorClass
{
private:
    int value;
public:
    functorClass(int _v):value(_v){}
    int operator() (){
        return value++;
    }
};

int main()
{
vector<int> iv;
generate_n(back_inserter(iv),10,functorClass(10));
for_each(iv.begin(),iv.end(),[](int i)->void {cout<<i<<" ";});
cout<<endl;
generate(iv.begin(),iv.end(),functorClass(100));
for_each(iv.begin(),iv.end(),[](int i)->void {cout<<i<<" ";});
system("pause");
}

注意:把仿函数当作参数传递时,默认是传值!要传址,需要在传入仿函数时在泛型参数中声明传址。

 

2)仿函数可以当作类型传入,而一般函数显然是不可以的。

class functorClass
{
public:
void operator() (){
  /* statements */
 }
}

int main()
{
  set<int,functorClass> exampleSet;
  ......
}

 

  • 判断式与仿函数的区别:

判定式就是一个可以返回bool值的一个函数或仿函数。

*此处有陷阱,使用判断式时要注意判断式最好跟状态不关,否则可能会有影响。不展开,记住判断式如果要利用仿函数可以保存状态的这个特性时要多加小心。

 

  • 预定义仿函数的头文件:

#include <functional>

 

  • 其它相关概念:

1)函数配接器:指可以将仿函数和另一个仿函数结合起来的仿函数。

函数配接器可以把简单的仿函数组合成功能更强大的仿函数,但是具体不展开。