3

请注意,我不是在寻求答案。我只是好奇为什么事情会奏效

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

有问题的代码:java2s 优先队列示例

为什么 operator< 需要重载?'<' 甚至在哪里进行比较?实现运算符重载会改变队列 STL 的工作方式吗?

这个实现对我来说似乎并不直观:为什么 operator> 没有被重载呢?应该如何知道 operator< 需要重载才能让 priority_queue 正常工作?

4

5 回答 5

9

对于那些对内容进行排序的容器,STL 容器默认使用 operator< 来对内容进行排序。

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

可以选择 Operator>,但必须选择一个,那就是 operator<,然后在任何地方使用以保持一致性。

于 2009-03-26T06:05:59.657 回答
4

为什么 operator< 需要重载?

中的Compare函数对象priority_queue<T, Sequence, Compare>

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

LessThanComparable 文档

笔记

1只有 operator< 是基本的;其他不等式运算符本质上是语法糖。

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

[3] 由于非自反性和传递性,operator< 总是满足偏序的定义。严格弱序的定义更加严格,全序的定义更加严格。

'<' 甚至在哪里进行比较?

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

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

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

于 2009-03-26T06:26:37.953 回答
2

priority_queue<T>uses std::less<T>,这又需要T() < T()是一个有效的表达式。可以是成员,也可以是非成员,但表达式必须有效。

但是,std::less<T>可能是专门的,因此您声明 operator< 需要重载有点误导。

于 2009-03-26T10:39:20.093 回答
1

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

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

于 2009-03-26T06:09:07.997 回答
1

仅供参考:std::priority_queue 可以接受比较谓词。
operator< 用作默认行为。这是最低要求。

为什么 operator> 不被重载

我认为是历史原因。在数学中,所有示例通常都描述为 < 操作,并且一个操作符足以定义所有其他操作(>、<=、>=、==、!=)。

这个实现对我来说似乎并不直观

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

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

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

于 2009-03-26T06:49:36.790 回答