概念:
- 重载了函数调用操作符的类,其对象称为函数对象。
- 函数对象使用重载的()时,行为类似函数调用,也叫仿函数。
本质:
- 函数对象(仿函数)是一个类,不是函数。
使用:
- 函数对象在使用时,可以像普通函数那样调用,可以有参数和返回值。
#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;
}