函数对象(仿函数)
- 重载函数调用操作符的类,其对象常称为函数对象
- 函数对象使用重载()时,行为类似函数调用,也叫仿函数
- 函数对象(仿函数)本质是一个类,不是函数
1.函数对象使用
- 在使用时,可以像普通函数调用,可以有参数和返回值
- 函数对象超出普通函数的概念,函数对象可以有自己的状态
- 函数对象可以作为参数传递
举例:
函数对象可以有参数和返回值
class MyAdd
{
public :
int operator()(int v1, int v2)
{
return v1 + v2;
}
};
void test01()
{
MyAdd myAdd;
cout << myAdd(10, 10) << endl;
}
函数对象可以有自己的状态
class MyPrint
{
public:
int count;
public:
MyPrint()
{
this->count = 0; //内部自己的状态
}
void operator()(string test)
{
cout << test << endl;
this->count++; //统计调用次数
}
};
void test02()
{
MyPrint myPrint;
myPrint("hello world");
myPrint("hello world");
myPrint("hello world");
myPrint("hello world");
myPrint("hello world");
cout << "myPrint调用次数 " << myPrint.count << endl;
}
函数对象可以作为参数传递
void doPrint(MyPrint &myPrint,string test)
{
myPrint(test);
}
void test03()
{
MyPrint myPrint;
doPrint(myPrint,"CPP");
}
2.内建函数对象
使用前,需要引入头文件 #include< functional >
分类:算术仿函数、关系仿函数、逻辑仿函数
a) 算术仿函数
实现四则运算
其中negate是一元运算,其他的都是二元运算
函数原型 | 解释 |
---|---|
template< class T> T plus< T > | 加法 |
template< class T> T minus< T > | 减法 |
template< class T> T multiplies< T > | 乘法 |
template< class T> T divides< T > | 除法 |
template< class T> T modulus< T > | 取模 |
template< class T> T negate< T > | 取反 |
b) 关系仿函数
函数原型 | 解释 |
---|---|
template< class T> bool equal_to< T > | 等于 |
template< class T> bool not_equal_to< T > | 不等于 |
template< class T> bool greater< T > | 大于 |
template< class T> bool greater_equal< T > | 大于等于 |
template< class T>bool less< T > | 小于 |
template< class T> bool less_equal< T > | 小于等于 |
c) 逻辑仿函数
函数原型 | 解释 |
---|---|
template< class T> bool logical_and< T > | 逻辑 与 |
template< class T> bool logical_or< T > | 逻辑 或 |
template< class T> bool logical_not< T > | 逻辑 非 |
//利用逻辑非,将容器v搬运到容器v2中,并执行取反操作。
vector<bool>v2;
v2.resize(v.size());
transform(v.begin(), v.end(), logical_not<bool>());
谓词
返回bool类型的仿函数称为谓词
- 如果operator()接受一个参数,那么叫做一元谓词
- 如果operator()接受二个参数,那么叫做二元谓词
1.一元谓词
举例:指定 “返回值大于5” 的规则
class MyCompare
{
public:
bool operator()(int& val)
{
return val > 5;
}
};
2.二元谓词
举例:指定 “降序排序” 的规则
class MyCompare
{
public:
bool operator()(int& val1, int& val2)
{
return val1 > val2;
}
};