为啥在c++中实现基于类的优先级队列时需要重载operator<?

Posted

技术标签:

【中文标题】为啥在c++中实现基于类的优先级队列时需要重载operator<?【英文标题】:Why does operator< need to be overloaded when implementing class-based priority queues in c++?为什么在c++中实现基于类的优先级队列时需要重载operator<? 【发布时间】:2009-03-26 05:58:51 【问题描述】:

注意,我不是在寻求答案。我只是好奇为什么事情会起作用

我需要为类分配的打印机模拟器实现一个优先级队列。看了网上的例子后,我注意到 operator

code in question: java2s priority queue example

为什么 operator

这个实现对我来说似乎并不直观:为什么 operator> 没有被重载呢?应该如何知道 operator

【问题讨论】:

您通过阅读文档了解到 operator 【参考方案1】:

STL 容器默认使用 operator

您可以通过将比较函子传递给容器的构造函数来覆盖它,这允许您将排序/排序与容器对象分离。

Operator> 可以选择,但必须选择一个,那就是 operator

【讨论】:

【参考方案2】:

为什么operator

priority_queue&lt;T, Sequence, Compare&gt;中的Compare函数对象:

Compare 在其参数类型上引入严格的弱排序,如 LessThan Comparable 要求中所定义。

LessThanComparable documentation:

注意事项

1 只有 operator

2 反对称是一个定理,而不是一个公理:它源于非自反性和传递性。

[3] 由于非自反性和传递性,operator

void push(const value_type&amp; x) 在队列中插入一个值。

实现运算符重载会改变队列 STL 的工作方式吗?

是的,当然。如果你在比较中交换元素的顺序,你的排序就会相反。

【讨论】:

【参考方案3】:

priority_queue&lt;T&gt; 使用std::less&lt;T&gt;,这反过来又要求T() &lt; T() 是一个有效的表达式。可以是成员,也可以是非成员,但表达式必须有效。

但是,std::less&lt;T&gt; 可能是专门的,因此您声明 operator

【讨论】:

【参考方案4】:

好的,基本原因是优先队列是一种结构,其中插入的项目按照某个排序函数的顺序返回。您需要一个排序,而处理它的明显方法是重载 operatorif( a < b) 可以说比if(isLessThan(a,b)) 或类似的东西更具可读性。

你不要超载operator&gt;,因为它不是必需的;优先级队列中唯一需要的操作是小于。这并不意味着您不能拥有一个,但由于您有一个==,您可以简单地实现它——或者只是反转操作数。

【讨论】:

【参考方案5】:

仅供参考:std::priority_queue 可以接受比较谓词。 operator

为什么没有 operator> 被重载 而是

我认为是历史原因。在数学中,所有示例通常都描述为 、=、==、!=)。

这个实现似乎没有 对我来说很直观

对我来说,这个界面是意料之中的。我认为这是习惯。

是否实现了操作符 重载改变队列STL的方式 有效吗?

不,不。不是 STL 队列,只有您的队列 - 对于您的类型,如果您自己的比较器未定义。

【讨论】:

以上是关于为啥在c++中实现基于类的优先级队列时需要重载operator<?的主要内容,如果未能解决你的问题,请参考以下文章

在我的二进制堆/优先级队列实现中实现删除时遇到问题

使用 STL 在 C++ 中实现 Bentley-Ottmann

PHP中实现函数重载

C++ 我在设置我创建的类的优先级队列时遇到问题

为啥我需要在 C++ 中使用不同的排序格式来对这个 USACO 代码上的数组和优先级队列进行排序?

如何在 Python 中实现优先级队列?