函数 - 它们是否用于使运算符重载更容易?

时间:2015-08-19 17:25:03

标签: c++ stl

下面的代码很常见,以实现Min-Heap:

singleton

Functors如何运作? 他们在C ++中解决了什么目的? 我可以看到Functors更常用于重载比较。 它们只是用来简化操作员重载吗?

何时创建Functors? 如何创建自己的仿函数?

2 个答案:

答案 0 :(得分:2)

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

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

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

答案 1 :(得分:1)

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

cppreference

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

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