请注意,我不是要求答案。我只是好奇为什么事情有效
我需要为类分配实现打印机模拟器的优先级队列。在互联网上查看示例后,我注意到运营商<正在被重载以正确安排优先级队列。
code in question: java2s priority queue example
为什么运营商<需要超载? '<'在哪里甚至用来做比较?实现运算符重载是否会改变队列STL的工作方式?
这个实现对我来说似乎并不直观:为什么不是运算符>反而超载?一个人应该如何学习该算子<需要重载才能使priority_queue正常工作?
答案 0 :(得分:9)
STL容器使用运算符<默认情况下,为订购内容的容器订购内容。
您可以通过将比较仿函数传递给容器的构造函数来覆盖它,这允许您从容器对象中分离排序/排序。
操作员及GT;可以选择,但必须选择一个运算符<,然后在任何地方使用以保持一致性。
答案 1 :(得分:4)
为什么运营商<需要超载?
priority_queue<T, Sequence, Compare>
中的Compare
函数对象:
比较会在LessThan Comparable要求中对其参数类型引入严格的弱排序。
LessThanComparable documentation:
注释
1只有运营商&lt;是根本的;其他不等式算子本质上是语法糖。
2反对称是一个定理,而不是一个公理:它来自于非反射性和传递性。
[3]由于无反射性和传递性,运算符&lt;总是满足部分排序的定义。严格弱序的定义更严格,总排序的定义更严格。
'&lt;'在哪里甚至用来做比较?
void push(const value_type& x)
在队列中插入一个值。
实现运算符重载会改变队列STL的工作方式吗?
是的,当然。如果你在比较中交换元素的顺序,那么你的排序就是另一种方式。
答案 2 :(得分:2)
priority_queue<T>
使用std::less<T>
,后者又要求T() < T()
成为有效的表达式。可以是会员,可以是非会员,但表达必须有效。
但是,std::less<T>
可能是专门的,所以你的声明是运营商&lt;需要超载有点误导。
答案 3 :(得分:1)
好的,基本原因是优先级队列是一种结构,其中插入的项目按某种顺序函数的顺序返回。你需要一个排序,处理它的明显方法是重载operator&lt;。您可以按名称使用函数,但是可以说if( a < b)
可以说比if(isLessThan(a,b))
更具可读性。
您不会超载operator>
,因为它不需要;优先级队列中唯一需要的操作是小于。这并不意味着你不能拥有一个,但是因为你有一个==
,你可以简单地实现它 - 或者只是反转操作数。
答案 4 :(得分:1)
仅供参考:std :: priority_queue可以接受比较谓词 运营商LT;用作默认行为。这是最低要求。
为什么不是运营商&gt;超载 代替
我认为是历史真相。在数学上,通常用于描述&lt;操作,并且一个操作员应该定义所有其他操作(&gt;,&lt; =,&gt; =,==,!=)。
这种实现似乎并不存在 对我来说很直观
对我来说,这个界面是预期的。我认为这是habbit。
实施运营商 过载改变了队列STL的方式 作品?
不,不。不是STL队列,只有你的队列 - 对于你的类型,如果你自己的比较器没有定义。