📜  c++中的函子(1)

📅  最后修改于: 2023-12-03 14:59:51.172000             🧑  作者: Mango

C++中的函子

什么是函子?

函子(Functor)是一个把其他对象当作函数来使用的对象,它可以像函数一样被调用。在C++中,函子是一个实现了函数调用运算符(operator())的类。

函数对象和函子

函数对象是一种可调用对象,它是一个类的实例。这个类必须实现函数调用运算符。函子是函数对象的一种,也可以称为可调用对象或函数器。

使用函子的好处

使用函子可以使代码更加灵活和抽象。通过传递一个可调用对象作为参数,我们可以在运行时改变代码行为。同时,函子可以用于泛型编程,使得代码更加通用。

C++中的函子实现方式

C++中实现函子的方式有两种:

1. 通过函数调用运算符实现
class Functor {
public:
    int operator()(int a, int b) const {
        return a + b;
    }
};

在这个例子中,我们定义了一个函子(Functor),它有一个函数调用运算符(operator()),它接受两个整数参数并返回它们的和。

我们可以像使用普通函数一样调用它:

Functor f;
int result = f(1, 2);  // result = 3
2. 通过重载函数调用运算符实现
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头文件中。以下是一些常用的函子:

  • plus:实现加法运算(二元运算)
  • minus:实现减法运算(二元运算)
  • multiplies:实现乘法运算(二元运算)
  • divides:实现除法运算(二元运算)
  • modulus:实现取模运算(二元运算)
  • equal_to:判断两个值是否相等(二元运算)
  • not_equal_to:判断两个值是否不相等(二元运算)
  • greater:判断第一个值是否大于第二个值(二元运算)
  • less:判断第一个值是否小于第二个值(二元运算)
  • greater_equal:判断第一个值是否大于等于第二个值(二元运算)
  • less_equal:判断第一个值是否小于等于第二个值(二元运算)
  • logical_and:逻辑与(二元运算)
  • logical_or:逻辑或(二元运算)
  • logical_not:逻辑非(一元运算)

我们可以将这些函子作为参数传递给标准库算法函数,如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++标准库中提供了许多内置的函子,它们可以作为参数传递给标准库算法函数。