【问题标题】:STL pair comparison - first elementsSTL 对比较 - 第一个元素
【发布时间】:2015-06-06 18:25:11
【问题描述】:

谁能解释一下这一段的意思

pairs 的最大优势在于它们具有用于比较自身的内置操作。对是比较第一个到第二个元素。 如果第一个元素s不相等,结果将仅基于第一个元素的比较;只有当第一个元素相等时,才会比较第二个元素。对的数组(或向量)可以很容易地通过 STL 内部函数进行排序。

所以这个

例如,如果要对整数点数组进行排序,使它们形成一个多边形,最好将它们放入向量 >,其中每个元素向量是{极角,{x,y}}。一次调用 STL 排序函数将为您提供所需的点顺序。

我已经挣扎了一个小时才明白这一点。
Source

【问题讨论】:

    标签: c++ stl


    【解决方案1】:

    考虑在operator< 中查看pair<A,B>,这是一个看起来像这样的类:

    struct pairAB {
        A a;
        B b;
    };
    

    您可以将该段落直接翻译成代码:

    bool operator<(const pairAB& lhs, const pairAB& rhs) {
        if (lhs.a != rhs.a) {         // If the first elements are not equal
            return lhs.a < rhs.a;     // the result will be based on 
        }                             // the comparison of the first elements only
    
        return lhs.b < rhs.b;         // the second elements will be compared
                                      // only if the first ones are equal.
    }
    

    或者,更抽象地思考,这就是字典排序的工作原理。想想你将如何订购两个词。你会比较它们的第一个字母——如果它们不同,你可以停下来看看哪个字母少。如果它们相同,则转到第二个字母。

    【讨论】:

      【解决方案2】:

      第一段说对有如下顺序:如果你有 (x, y)(z, w),然后比较它们,那么它将首先检查 x 是否小于(或大于)z:如果是,则第一对小于(或大于)第二对。但是,如果 x = z,那么它将比较 yw。如果对的第一个元素对顺序比第二个元素更重要,这使得对向量对的排序等操作变得非常方便。

      第二段给出了一个有趣的应用。假设你站在平面上的某个点,并且有一个多边形包围着你。然后每个点都会有一个角度和一个距离。但是考虑到这些点,你怎么知道它们应该以什么顺序形成一个多边形(而不是相互交叉)?如果您以这种格式(角度,距离)存储点,那么您将免费获得盘旋方向。这实际上相当整洁。

      【讨论】:

        【解决方案3】:

        STL 对是将两个对象放在一起的容器。以这个为例,

        对a,b;

        第一个元素可以通过 a.first 访问,第二个元素可以通过 a.second 访问。

        第一段告诉我们,STL 提供了内置操作来比较两对。例如,您需要比较'a'和'b',那么首先使用a.first和b.first进行比较。如果两个值相同,则使用 a.second 和 b.second 进行比较。由于这是一个内置功能,您可以轻松地将其与 STL 的内部函数(如 sort、b_search 等)一起使用。

        第二段是如何使用它的示例。考虑一种情况,您希望对多边形中的点进行排序。您首先要根据它们的极角对它们进行排序,然后是 x 坐标,然后是 y 坐标。因此我们使用了对 {angle, {x,y}}。因此,任何比较都将首先在角度上进行,然后推进到 x 值,然后是 y 值。

        【讨论】:

          【解决方案4】:

          如果比较一个简单的姓和名对的例子会更容易理解。

          例如,如果你有对

          { Tomson, Ann }
          { Smith, Tony }
          { Smith, John }
          

          并且想要按升序对它们进行排序,您必须将它们相互比较。

          如果你比较前两对

          { Tomson, Ann }
          { Smith, Tony }
          

          那么第一对的姓大于第二对的姓。所以没有必要比较名字。这对已经很清楚了

          { Smith, Tony }
          

          必须在对之前

          { Tomson, Ann }
          

          另一方面,如果你比较成对

          { Smith, Tony }
          { Smith, John }
          

          那么这对的姓氏是相等的。所以你需要比较这些对的名字。由于约翰比托尼小,所以很明显这对

          { Smith, John }
          

          将在对之前

          { Smith, Tony }
          

          虽然姓氏(对的第一个元素)是相等的。

          至于这对{ polar angle, { x, y } },那么如果两个不同对的极角相等,那么将比较{ x, y },这反过来又是一对。因此,如果第一个元素 ( x ) 相等,则会比较 y(s)。

          【讨论】:

            【解决方案5】:

            实际上,当您拥有成对的向量/数组时,您使用 sort() 函数时不必关心排序,您只需使用 sort(v.begin(),v.end())->它将根据第一个元素自动排序,当第一个元素相等时,它们将使用第二个元素进行比较。查看链接中的代码和输出,一切都会清楚。 https://ideone.com/Ad2yVG.see code in link

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2015-12-16
              • 2012-02-19
              • 1970-01-01
              • 2020-02-28
              相关资源
              最近更新 更多