📜  C++中的函子(1)

📅  最后修改于: 2023-12-03 15:29:54.234000             🧑  作者: Mango

C++中的函子

C++中的函子是一种特殊的函数对象,它能够被当做普通函数一样使用。函子是一个类对象,它重载了“()”操作符,使得该对象可以像函数一样被调用。本文将为您介绍函子的概念、构造方法、使用场景以及示例代码。

概念

在C++中,函数也是一种对象。它可以被指针或者引用表示,并且可以被当做参数传递。 函数对象(Functor)是一个类对象,该对象可以像函数一样被调用。函子一般作为一种回调机制被广泛应用,最初由STL标准库中的算法和函数对象组成的。

构造方法

创建函子(Functor)一般需要定义一个包含“operator()”操作符的类。该操作符定义了对象被调用时,执行的具体操作。

以下是创建函子的示例代码:

class AddFunctor
{
public:
    int operator() (int a, int b) const
    {
        return a + b;
    }
};

在上例中,我们定义了一个AddFunctor类,它包含了一个“operator()”操作符。此处,我们定义了一个加法操作,以便对象被调用时执行。在该函子中,我们接收两个整数类型的参数并返回它们的和。

使用场景

函子的一大优势在于,它能够将函数作为一种数据类型进行传递和使用。函数指针是C++中最经典的函数式编程技术,而函子则可以完成所有函数指针的功能,并拥有更多的优势。因此,函子在很多场景中被广泛应用,比如:

  • 对 STL 算法或容器中的元素进行操作
  • 在多线程编程中,将函数作为回调机制传递
  • 实现一些高阶函数式编程中传递函数的技巧
示例代码

下面是使用函子进行排序的示例代码:

#include <algorithm>
#include <iostream>
#include <vector>

using namespace std;

class SortFunctor
{
public:
    bool operator() (int a, int b)
    {
        return a > b;
    }
};

int main()
{
    vector<int> v = {5, 3, 1, 4, 2};
    SortFunctor functor;
    sort(v.begin(), v.end(), functor);
    for (auto i : v) {
        cout << i << " ";
    }
    cout << endl;
    return 0;
}

在上述代码中,我们定义了一个SortFunctor类,该类包含一个“operator()”操作符。在该操作符中,我们接收两个参数并返回它们的排序结果。接着,我们在main函数中,使用该函子对vector中的元素进行排序,最后输出排序结果。