我们可以定义 operator < 但人们似乎总是使用类来定义 operator ()?
这究竟是如何工作的。
我以前在 C 中学过这样的泛型,那时我们使用指向函数的指针。
有什么区别?
最佳答案
基本上,您希望您的代码包含最少的意外。
假设您有一个 std::priority_queue<T> pq
为你的类(class)T
.是T
存在自然排序的类?如果是这样,定义一个 operator <
为了它。你要吗pq
根据此顺序确定优先级?如果是这样,就让它使用 operator <
大功告成。
然而,很多时候,T
是一个没有内在排序概念的类。想象一个类Employee
存储 name
, startingDate
和 salary
.没有通用排序 - 给定两名员工,不清楚谁是 <
比另一个。
同时,你可能想要一个std::priority_queue<Employee>
根据谁赚得最多。或者至少。或者谁在公司工作时间最长。因此,您将为这些使用特定的比较器。
在某种程度上,优先级队列比较器和operator <
是独立的概念。如果你有一个自然可订购的类(class),给它 operator <
.如果你想要一个优先级队列,给它一个合适的谓词。如果该谓词恰好是 operator <
, 让它使用它。
至于为什么要使用 operator()
的类而不是指向函数的指针,我会说主要原因是打字和构造。 Class 使用比较器的模板(例如 std::priority_queue
或 std::map
)将比较器的类型 作为模板参数(它们没有其他选项)。那么,在构造容器时,你有两个选择:提供一个比较器类型的对象,或者让类默认构造一个。
当比较器的类型是一个类(具有默认构造函数,通常存在于这些仿函数类中)时,std::priority_queue
的构造函数可以默认构造它并工作。如果您使用函数指针,则队列的类型将为例如std::priority_queue<T, SomeContainer, bool (*)(const T&, constT&)>
,并且您必须将适当的函数指针传递给您创建的每个队列。
关于c++ - 谁能解释更多关于优先队列C++中的比较函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22218362/