【问题标题】:Why does operator< need to be overloaded when implementing class-based priority queues in c++?为什么在c++中实现基于类的优先级队列时需要重载operator<?
【发布时间】:2009-03-26 05:58:51
【问题描述】:

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

我需要为类分配的打印机模拟器实现一个优先级队列。看了网上的例子后,我注意到 operator

code in question: java2s priority queue example

为什么 operator

这个实现对我来说似乎并不直观:为什么 operator> 没有被重载呢?应该如何知道 operator

【问题讨论】:

  • 您通过阅读文档了解到 operator

标签: c++ operator-overloading priority-queue


【解决方案1】:

STL 容器默认使用 operator

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

Operator> 可以选择,但必须选择一个,那就是 operator

【讨论】:

    【解决方案2】:

    为什么operator

    priority_queue&lt;T, Sequence, Compare&gt;中的Compare函数对象:

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

    LessThanComparable documentation:

    注意事项

    1 只有 operator

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

    [3] 由于非自反性和传递性,operator

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

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

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

    【讨论】:

      【解决方案3】:

      priority_queue&lt;T&gt; 使用std::less&lt;T&gt;,这反过来又要求T() &lt; T() 是一个有效的表达式。可以是成员,也可以是非成员,但表达式必须有效。

      但是,std::less&lt;T&gt; 可能是专门的,因此您声明 operator

      【讨论】:

        【解决方案4】:

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

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

        【讨论】:

          【解决方案5】:

          仅供参考:std::priority_queue 可以接受比较谓词。
          operator

          为什么没有 operator> 被重载 而是

          我认为是历史原因。在数学中,所有示例通常都描述为 、=、==、!=)。

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

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

          是否实现了操作符 重载改变队列STL的方式 有效吗?

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

          【讨论】:

            猜你喜欢
            • 2021-12-20
            • 1970-01-01
            • 1970-01-01
            • 2010-10-18
            • 2023-04-03
            • 1970-01-01
            • 2021-07-28
            • 2019-11-22
            • 1970-01-01
            相关资源
            最近更新 更多