C++ 中的函数对象(仿函数)

概念:

  • 重载了函数调用操作符的类,其对象称为函数对象。
  • 函数对象使用重载的()时,行为类似函数调用,也叫仿函数。

本质:

  • 函数对象(仿函数)是一个类,不是函数。

使用:

  • 函数对象在使用时,可以像普通函数那样调用,可以有参数和返回值。
#include<iostream>
using namespace std;

class MyAdd
{
public:
    int operator()(int v1, int v2)
    {
        return v1 + v2;
    }
};

int main()
{
    MyAdd add;
    cout << add(2,4) << endl;

    getchar();
    return 0;
}
  • 函数对象超出了普通函数的概念,可以有自己的状态。

       如下例中mCount就记录了函数调用次数。

#include<iostream>
#include<string>
using namespace std;

class MyPrint
{
public:
    MyPrint() :mCount(0) {}
    int GetCount() const { return mCount; }

    void operator()(const string &str)
    {
        cout << str << endl;
        mCount++;
    }
private:
    int mCount;   //统计函数调用次数
};

int main()
{
    MyPrint print;
    print("April");
    print("Harris");
    print("Dave");

    cout << "函数调用次数: "<< print.GetCount() << endl;

    getchar();
    return 0;
}
  • 函数对象可以作为参数传递。
void DoSomething(MyPrint &print, const string &str)
{
    print(str);
}

int main()
{
    MyPrint print;
    DoSomething(print, "April");

    getchar();
    return 0;
}

内建函数对象

    STL内建了一些函数对象,分为算术仿函数、关系仿函数、逻辑仿函数。

    这些仿函数产生的对象,用法和一般函数完全相同。使用内建函数对象,需要引入头文件<functional>。

  • 算术仿函数。

       加、减、乘、除、取反、模运算。

#include<iostream>
#include<functional>
using namespace std;

int main()
{
    negate<int> n;
    cout << n(50) << endl;   //取反

    plus<int> p;
    cout << p(20, 10) << endl;  //相加

    minus<int> m;
    cout << m(20, 10) << endl;  //相减

    multiplies<int> mul;
    cout << mul(20, 10) << endl;  //相乘

    divides<int> d;
    cout << d(20, 10) << endl;    //相除

    modulus<int> mod;
    cout << mod(20, 10) << endl;    //模运算

    getchar();
    return 0;
}
  • 关系仿函数。

     大于、大于等于、小于、小于等于、相等、不等。

#include<iostream>
#include<vector>
#include<algorithm>
#include<functional>
using namespace std;

int main()
{
    vector<int> v = { 20,30,70,90,50 };
    sort(v.begin(), v.end(), greater<int>());        //从大到小排列
    sort(v.begin(), v.end(), less<int>());           //从小到大排列

    getchar();
    return 0;
}
  • 逻辑仿函数。

       与、或、非。

#include<iostream>
#include<vector>
#include<algorithm>
#include<functional>
using namespace std;

int main()
{
    vector<bool> s = { true,false,true };
    vector<bool> d;
    d.resize(s.size());
    transform(s.begin(), s.end(), d.begin(), logical_not<bool>());  //s中的元素取反后,放入d中.

    getchar();
    return 0;
}
发布了515 篇原创文章 · 获赞 135 · 访问量 30万+

猜你喜欢

转载自blog.csdn.net/liyazhen2011/article/details/103195722