代码之家  ›  专栏  ›  技术社区  ›  agscala

在C++中实现基于类的优先级队列时,操作员为什么需要重载?

  •  3
  • agscala  · 技术社区  · 15 年前

    注意,我不是在问答案。我只是好奇事情为什么会起作用

    我需要为类分配的打印机模拟器实现一个优先级队列。在查看了互联网上的示例后,我注意到为了正确安排优先级队列,操作人员过载。

    code in question: java2s priority queue example

    为什么操作员需要过载?在哪里使用“<”进行比较?实现操作符重载是否会改变队列stl的工作方式?

    这种实现对我来说根本不直观:为什么不让操作员过载?为了使优先级队列正常工作,应该如何了解操作员需要过载?

    5 回复  |  直到 15 年前
        1
  •  9
  •   camh    15 年前

    STL容器在默认情况下使用运算符<为订购内容的容器订购内容。

    您可以通过将比较函数传递给容器的构造函数来覆盖这一点,该函数允许您将排序/排序从容器对象中分离出来。

    可以选择运算符>,但必须选择一个运算符,即运算符<,然后在任何地方使用它以保持一致性。

        2
  •  4
  •   dirkgently    15 年前

    为什么操作员需要过载?

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

    比较导致了一个严格的弱排序,如Lessthan可比较的要求中所定义的,关于它的参数类型。

    LessThanComparable documentation :

    笔记

    1 只有算符才是基本的;其他不等式算符本质上是句法上的糖。

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

    [3]由于不可恢复性和传递性,运算符<始终满足部分排序的定义。严格弱序的定义更严格,而完全序的定义更严格。

    在哪里使用“<”进行比较?

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

    实现操作符重载是否会改变队列stl的工作方式?

    是的,当然。如果您在比较中交换元素的顺序,那么您的排序就与之相反。

        3
  •  2
  •   MSalters    15 年前

    priority_queue<T> 使用 std::less<T> ,这反过来需要 T() < T() 为有效表达式。可以是成员,也可以是非成员,但表达式必须有效。

    然而, 标准::更少<t> 可能是专门化的,因此您关于运算符<需要过载的声明有点误导性。

        4
  •  1
  •   Charlie Martin    15 年前

    好的,基本的原因是优先级队列是一个结构,在这个结构中,插入的项按照某个order函数的顺序返回。您需要一个命令,而处理它的明显方法是通过重载操作符<。你可以有一个按名称命名的函数,但是可以说 if( a < b) 可以说比 if(isLessThan(a,b)) 或者类似的。

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

        5
  •  1
  •   bayda    15 年前

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

    为什么操作员不超载? 相反

    我从历史的角度考虑。在数学中,通常为<operation描述的所有示例中,一个运算符用于定义所有其他操作(>、<=、>=、==、!=)

    这个实现似乎没有 对我来说很直观

    对于我来说,这个接口是需要的。我认为这是哈比特。

    执行操作员 重载更改队列stl的方式 作品?

    不,不,不是stl队列,只有您的队列——对于您的类型,如果您自己的comparator没有定义的话。