📅  最后修改于: 2023-12-03 14:59:51.172000             🧑  作者: Mango
函子(Functor)是一个把其他对象当作函数来使用的对象,它可以像函数一样被调用。在C++中,函子是一个实现了函数调用运算符(operator())的类。
函数对象是一种可调用对象,它是一个类的实例。这个类必须实现函数调用运算符。函子是函数对象的一种,也可以称为可调用对象或函数器。
使用函子可以使代码更加灵活和抽象。通过传递一个可调用对象作为参数,我们可以在运行时改变代码行为。同时,函子可以用于泛型编程,使得代码更加通用。
C++中实现函子的方式有两种:
class Functor {
public:
int operator()(int a, int b) const {
return a + b;
}
};
在这个例子中,我们定义了一个函子(Functor),它有一个函数调用运算符(operator()),它接受两个整数参数并返回它们的和。
我们可以像使用普通函数一样调用它:
Functor f;
int result = f(1, 2); // result = 3
class Add {
public:
int operator()(int a, int b) const {
return a + b;
}
};
class Subtract {
public:
int operator()(int a, int b) const {
return a - b;
}
};
在这个例子中,我们定义了两个函子(Add和Subtract),它们都有一个重载的函数调用运算符(operator()),它们分别实现了加法和减法运算。
我们可以像使用普通函数一样调用它们:
Add add;
Subtract subtract;
int result1 = add(1, 2); // result1 = 3
int result2 = subtract(1, 2); // result2 = -1
C++标准库中提供了许多内置的函子,它们通常定义在functional头文件中。以下是一些常用的函子:
我们可以将这些函子作为参数传递给标准库算法函数,如sort、find、for_each等。
vector<int> v = {3, 2, 1};
sort(v.begin(), v.end(), greater<int>()); // v = {3, 2, 1}
vector<int> v1 = {1, 2, 3};
vector<int> v2 = {3, 2, 1};
vector<int> v3(v1.size());
transform(v1.begin(), v1.end(), v2.begin(), v3.begin(), plus<int>()); // v3 = {4, 4, 4}
函子是一个实现了函数调用运算符的类,它可以像函数一样被调用。使用函子可以使代码更加灵活和抽象,同时也可以用于泛型编程,使得代码更加通用。C++标准库中提供了许多内置的函子,它们可以作为参数传递给标准库算法函数。