函子——它们是用来使操作符重载更容易吗?
Functors - Are they used to make Operator Overloading more easy?
下面这段代码是实现最小堆的常用代码:
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;
相关文章:
- 重载操作符+:表达式必须是整型或无作用域枚举类型
- 重载操作符
- 如何重载操作符==外模板类使用友元函数
- 重载*操作符,使其在左右两边都工作
- 重载操作符<对于非随机迭代器
- 在c++中重载操作符的时间和原因
- 如何在c++中重载=操作符来通过引用进行复制
- 如何在c++中获取定义为友元的重载操作符的地址
- 使用重载操作符的文件操作表达式没有给出预期的结果
- 重载操作符()
- 重载操作符()并在类内使用
- 类中的重载操作符+
- 定时使用重载操作符
- c++带类的重载操作符
- 用列表容器重载[]操作符
- 重载操作符=
- 任何重载操作符()的静态检测
- 重载操作符以处理类对象
- 在使用另一个类的类中重载操作符==
- 派生类和基类中的重载操作符不同