C++ 为什么运营商<;在c+;中实现基于类的优先级队列时需要重载+;?
注意,我不是在问答案。我只是好奇为什么事情会发生 我需要为类分配的打印机模拟器实现一个优先级队列。在查看了internet上的示例后,我注意到operator<被重载,以便正确排列优先级队列C++ 为什么运营商<;在c+;中实现基于类的优先级队列时需要重载+;?,c++,operator-overloading,priority-queue,C++,Operator Overloading,Priority Queue,注意,我不是在问答案。我只是好奇为什么事情会发生 我需要为类分配的打印机模拟器实现一个优先级队列。在查看了internet上的示例后,我注意到operator
为什么运算符<需要重载?其中,“STL容器默认情况下使用运算符<对内容进行排序,对于排序内容的容器 您可以通过向容器的构造函数传递一个比较函子来覆盖它,这允许您将排序/排序与容器对象解耦
可以选择运算符>,但必须选择一个运算符,这就是运算符好的,基本原因是优先级队列是一种结构,在这种结构中,插入的项目按照某种顺序函数的顺序返回。您需要一个排序,处理它的明显方法是重载运算符 为什么运算符<需要重载
Compare
函数对象位于:
Compare在其参数类型上诱导严格弱排序,如LessThan Compariable requirements中所定义
:
注释
只有操作符<是基本的;其他不等式运算符本质上是语法糖
反对称性是一个定理,而不是公理:它源于不可伸缩性和传递性
[3] 由于不可伸缩性和传递性,算子<总是满足偏序的定义。严格弱序的定义更为严格,而全序的定义更为严格
其中是“FYI:std::priority\u队列可以接受比较谓词。
运算符<用作默认行为。这是最低要求 为什么操作符>没有过载 反而 我认为是历史原因。在数学中,所有示例通常描述为<运算,一个运算符足以定义所有其他运算(>,=,=,!=) 此实现似乎不适用 对我来说完全是直觉 对我来说,这个界面是意料之中的。我认为这是一种习惯 执行运算符是否正确 重载更改队列STL的方式 工作 不,不。不是STL队列,只有您的队列-对于您的类型,如果您自己的比较器未定义。
优先级\u队列使用std::less
,这反过来要求T()
为有效表达式。可以是成员,也可以是非成员,但表达式必须有效
然而,std::less
可能是专门化的,所以您关于操作符<需要重载的说法有点误导。您学习了该操作符