函子——它们是用来使操作符重载更容易吗?

Functors - Are they used to make Operator Overloading more easy?

本文关键字:重载 操作符 更容易 函子      更新时间:2023-10-16

下面这段代码是实现最小堆的常用代码:

struct comparator
{
    bool operator() ( int i, int j)
    { return j < i; }
};
priority_queue<int, std::vector<int>, comparator> minHeap;

函子是如何工作的?它们在c++中解决什么目的?我可以看到函子更常用于重载比较。它们只是用来简化操作符重载吗?

何时创建functor ?如何创建我们自己的函子?

comparator结构体是c++中通常称为'函子'的一个例子。一个函子是一个"可调用对象"——它是一个实现operator()(函数调用操作符)的常规对象。在STL容器中这样使用时,传递的是函函数的类型,而不是它的实例作为模板实参。容器将根据需要创建实例,以便在它们上实际调用operator()

如果你熟悉c++中的lambda,它们实际上只是函子的语法糖。lambda定义创建一个匿名类型,您可以将其视为编译器生成的函数类型,其operator()对应于lambda函数。

函子(或lambdas)是c++中将函数传递给类型或其他函数的标准方式。这在很多情况下都很有用,该示例允许您自定义priority_queue的排序标准。STL在容器和算法库中到处使用函数函数,作为在用户提供的函数上参数化类型和函数的一种方式。

comparator是内部用于对容器进行排序的函函数类型。

cppreference

默认情况下,STL使用内置比较器std::less执行i < j。在您的示例中,使用自定义比较器以反向顺序对容器进行排序。您的示例可以重写为:

priority_queue<int, std::vector<int>, std::greater> minHeap;