为什么运营商<在c ++中实现基于类的优先级队列时需要重载?

时间:2009-03-26 05:58:51

标签: c++ operator-overloading priority-queue

请注意,我不是要求答案。我只是好奇为什么事情有效

我需要为类分配实现打印机模拟器的优先级队列。在互联网上查看示例后,我注意到运营商<正在被重载以正确安排优先级队列。

code in question: java2s priority queue example

为什么运营商<需要超载? '<'在哪里甚至用来做比较?实现运算符重载是否会改变队列STL的工作方式?

这个实现对我来说似乎并不直观:为什么不是运算符>反而超载?一个人应该如何学习该算子<需要重载才能使priority_queue正常工作?

5 个答案:

答案 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队列,只有你的队列 - 对于你的类型,如果你自己的比较器没有定义。