基础介绍
什么是仿函数呢?仿函数是一种可以行使函数功能的类,通过重载operator()运算符,使得类对象可以像函数一样被调用。
class Add()
{
public:
int operator()(int a, int b)
{
return a+b;
}
};
int main()
{
Add add;
int result = add(3, 4); //像函数一样调用
std::cout << result<<std::endl; //输出7
return 0;
}
仿函数的种类
内置仿函数
c++提供了一些常用的仿函数,比如加减乘除等运算。依赖的头文件是#include <functional>
#include <functional>
#include <iostream>
int main()
{
std::plus<int> add; //加法
std::minus<int> sub; //减法
std::greater<int> greater; //比较大小
std::cout<<add(3, 4)<<std::endl; //输出7
std::cout<<sub(5, 2)<<std::endl; //输出3
std::cout<<greater(5, 2)<<std::endl; //输出true
}
自定义仿函数
有一些场景使用内置的仿函数无法满足要求,因为内置的仿函数一般只支持基本的数据类型,如int double等,对于一些用户自定义的类型,内置的仿函数无法实现需求。又或者用户对仿函数有更复杂的逻辑需求,内置的仿函数同样无法满足需求,所以需要用户自定义仿函数。请看下面的例子:
std::vector<int> vec = {4, 1, 3, 5, 2};
// 使用greater仿函数进行降序排序
std::sort(vec.begin(), vec.end(), std::greater<int>());
// 使用自定义仿函数
struct CustomCompare {
bool operator()(int a, int b) const {
return (a % 2) < (b % 2); // 按奇偶性排序
}
};
std::sort(vec.begin(), vec.end(), CustomCompare());
//自定义类型
class A
{
private:
int value1;
int value2;
A(int a, int b):value1(a),value2(b){}
}; //用户自定义类型
class Greater
{
public:
bool operator()(A a, A b)
{
return a.value1 > b.value1;
}
}; //用户自己实现的仿函数类,该仿函数类实现了根据用户类型的value1比较,这个内置仿函数类无法实现
int main()
{
A a(3,4);
A b(5,6);
Greater greater;
std::cout <<greater(a,b)<<std::endl;
}
注意事项
这个仿函数的形式与另外一种形式很相似,即将一个类隐式的转换为一个其他的类型,比如将一个类对象转换为一个整型,本专栏有专门的文章进行讲解:仿函数与类转换重载
这里仅提一嘴,将一个类对象直接转换为一个类型的语法如下:
operator 要转换的类型() {}
例如:
class MyClass
{
private:
int a;
public:
operator bool() {return a > 0;} //将类型转换为一个布尔型
//operator int(){return a + 10;} //转换为一个整数
MyClass(int value):a(value){}
}
int main()
{
A a(10);
std::cout<<a<<std::endl;
}
注意这里不一定是转换为基本数据类型,也可以转换为复杂的用户自定义类型。