c++ - 谁能解释更多关于优先队列C++中的比较函数

标签 c++ compare priority-queue

我们可以定义 operator < 但人们似乎总是使用类来定义 operator ()?

这究竟是如何工作的。

我以前在 C 中学过这样的泛型,那时我们使用指向函数的指针。

有什么区别?

最佳答案

基本上,您希望您的代码包含最少的意外。

假设您有一个 std::priority_queue<T> pq为你的类(class)T .是T存在自然排序的类?如果是这样,定义一个 operator <为了它。你要吗pq根据此顺序确定优先级?如果是这样,就让它使用 operator <大功告成。

然而,很多时候,T是一个没有内在排序概念的类。想象一个类Employee存储 name , startingDatesalary .没有通用排序 - 给定两名员工,不清楚谁是 <比另一个。

同时,你可能想要一个std::priority_queue<Employee>根据谁赚得最多。或者至少。或者谁在公司工作时间最长。因此,您将为这些使用特定的比较器。

在某种程度上,优先级队列比较器和operator <是独立的概念。如果你有一个自然可订购的类(class),给它 operator < .如果你想要一个优先级队列,给它一个合适的谓词。如果该谓词恰好是 operator < , 让它使用它。

至于为什么要使用 operator() 的类而不是指向函数的指针,我会说主要原因是打字和构造。 Class 使用比较器的模板(例如 std::priority_queuestd::map )将比较器的类型 作为模板参数(它们没有其他选项)。那么,在构造容器时,你有两个选择:提供一个比较器类型的对象,或者让类默认构造一个。

当比较器的类型是一个类(具有默认构造函数,通常存在于这些仿函数类中)时,std::priority_queue 的构造函数可以默认构造它并工作。如果您使用函数指针,则队列的类型将为例如std::priority_queue<T, SomeContainer, bool (*)(const T&, constT&)> ,并且您必须将适当的函数指针传递给您创建的每个队列。

关于c++ - 谁能解释更多关于优先队列C++中的比较函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22218362/

相关文章:

c++ - 混合并行 : MPI and TBB

php - 相同字符串的不同长度

youtube - youtube型网站的后端和前端选项

java - 要列出的优先队列。添加不正确

c++ - 使用 `std::greater` 通过 `priority_queue` 创建最小堆的原因

c++ - 尝试使用 random_device、mt19937 和uniform_int_distribution 时出现大量编译器错误

c++ - 是 new(&*p) double;无操作。因此,uninitialized_default_construct 是否也变为无操作?

c++ - 自定义堆中的段错误

c++ - OpenGL 顶点属性未启用

linux - 在另一个声音文件中查找一个声音文件