请注意,我不是在寻求答案。我只是好奇为什么事情会奏效
我需要为班级分配的打印机模拟器实现优先级队列。在查看互联网上的示例后,我注意到 operator< 被超载以正确安排优先级队列。
为什么 operator< 需要重载?'<' 甚至在哪里进行比较?实现运算符重载会改变队列 STL 的工作方式吗?
这个实现对我来说似乎并不直观:为什么 operator> 没有被重载呢?应该如何知道 operator< 需要重载才能让 priority_queue 正常工作?
请注意,我不是在寻求答案。我只是好奇为什么事情会奏效
我需要为班级分配的打印机模拟器实现优先级队列。在查看互联网上的示例后,我注意到 operator< 被超载以正确安排优先级队列。
为什么 operator< 需要重载?'<' 甚至在哪里进行比较?实现运算符重载会改变队列 STL 的工作方式吗?
这个实现对我来说似乎并不直观:为什么 operator> 没有被重载呢?应该如何知道 operator< 需要重载才能让 priority_queue 正常工作?
对于那些对内容进行排序的容器,STL 容器默认使用 operator< 来对内容进行排序。
您可以通过将比较函子传递给容器的构造函数来覆盖它,这允许您将排序/排序与容器对象分离。
可以选择 Operator>,但必须选择一个,那就是 operator<,然后在任何地方使用以保持一致性。
为什么 operator< 需要重载?
中的Compare
函数对象priority_queue<T, Sequence, Compare>
:
比较在其参数类型上引入严格的弱排序,如 LessThan Comparable 要求中所定义。
笔记
1只有 operator< 是基本的;其他不等式运算符本质上是语法糖。
2反对称是一个定理,而不是一个公理:它源于非自反性和传递性。
[3] 由于非自反性和传递性,operator< 总是满足偏序的定义。严格弱序的定义更加严格,全序的定义更加严格。
'<' 甚至在哪里进行比较?
void push(const value_type& x)
在队列中插入一个值。
实现运算符重载会改变队列 STL 的工作方式吗?
是的当然。如果你在比较中交换元素的顺序,你的排序就会相反。
priority_queue<T>
uses std::less<T>
,这又需要T() < T()
是一个有效的表达式。可以是成员,也可以是非成员,但表达式必须有效。
但是,std::less<T>
可能是专门的,因此您声明 operator< 需要重载有点误导。
好的,基本原因是优先级队列是一种结构,其中插入的项目按照某个排序函数的顺序返回。您需要一个排序,而处理它的明显方法是重载 operator<。您可以按名称拥有一个函数,但可以说if( a < b)
比if(isLessThan(a,b))
或类似的东西更具可读性。
你不会operator>
因为不需要而超载;优先级队列中唯一需要的操作是小于。这并不意味着你不能拥有一个,但既然你有一个==
,你可以简单地实现它——或者只是反转操作数。
仅供参考:std::priority_queue 可以接受比较谓词。
operator< 用作默认行为。这是最低要求。
为什么 operator> 不被重载
我认为是历史原因。在数学中,所有示例通常都描述为 < 操作,并且一个操作符足以定义所有其他操作(>、<=、>=、==、!=)。
这个实现对我来说似乎并不直观
对我来说,这个界面是意料之中的。我认为这是习惯。
实现运算符重载会改变队列 STL 的工作方式吗?
不,不。不是 STL 队列,只有您的队列 - 对于您的类型,如果您自己的比较器未定义。