【问题标题】:Why does operator< need to be overloaded when implementing class-based priority queues in c++?为什么在c++中实现基于类的优先级队列时需要重载operator<?
【发布时间】:2009-03-26 05:58:51
【问题描述】:
【问题讨论】:
标签:
c++
operator-overloading
priority-queue
【解决方案1】:
STL 容器默认使用 operator
您可以通过将比较函子传递给容器的构造函数来覆盖它,这允许您将排序/排序与容器对象分离。
Operator> 可以选择,但必须选择一个,那就是 operator
【解决方案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 队列,只有您的队列 - 对于您的类型,如果您自己的比较器未定义。