为啥在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<T, Sequence, Compare>
中的Compare
函数对象:
Compare 在其参数类型上引入严格的弱排序,如 LessThan Comparable 要求中所定义。
LessThanComparable documentation:
注意事项
1 只有 operator
2 反对称是一个定理,而不是一个公理:它源于非自反性和传递性。
[3] 由于非自反性和传递性,operator
“
void push(const value_type& x)
在队列中插入一个值。
实现运算符重载会改变队列 STL 的工作方式吗?
是的,当然。如果你在比较中交换元素的顺序,你的排序就会相反。
【讨论】:
【参考方案3】:priority_queue<T>
使用std::less<T>
,这反过来又要求T() < T()
是一个有效的表达式。可以是成员,也可以是非成员,但表达式必须有效。
但是,std::less<T>
可能是专门的,因此您声明 operator
【讨论】:
【参考方案4】:好的,基本原因是优先队列是一种结构,其中插入的项目按照某个排序函数的顺序返回。您需要一个排序,而处理它的明显方法是重载 operatorif( a < b) 可以说比if(isLessThan(a,b))
或类似的东西更具可读性。
你不要超载operator>
,因为它不是必需的;优先级队列中唯一需要的操作是小于。这并不意味着您不能拥有一个,但由于您有一个==
,您可以简单地实现它——或者只是反转操作数。
【讨论】:
【参考方案5】:仅供参考:std::priority_queue 可以接受比较谓词。 operator
为什么没有 operator> 被重载 而是
我认为是历史原因。在数学中,所有示例通常都描述为 、=、==、!=)。
这个实现似乎没有 对我来说很直观
对我来说,这个界面是意料之中的。我认为这是习惯。
是否实现了操作符 重载改变队列STL的方式 有效吗?
不,不。不是 STL 队列,只有您的队列 - 对于您的类型,如果您自己的比较器未定义。
【讨论】:
以上是关于为啥在c++中实现基于类的优先级队列时需要重载operator<?的主要内容,如果未能解决你的问题,请参考以下文章
使用 STL 在 C++ 中实现 Bentley-Ottmann