【问题标题】:Is std::pair<int, std::string> ordering well-defined?std::pair<int, std::string> 的顺序是否明确?
【发布时间】:2011-02-18 15:22:37
【问题描述】:

看来我可以对std::vector&lt;std::pair&lt;int, std::string&gt;&gt;进行排序,它会根据int值进行排序。这是一个定义明确的事情吗?

std::pair 是否有基于其元素的默认排序?

【问题讨论】:

    标签: c++ sorting stl


    【解决方案1】:

    std::pair 使用字典比较:它将根据第一个元素进行比较。如果第一个元素的值相等,则会根据第二个元素进行比较。

    C++03 标准(第 20.2.2 节)中的定义是:

    template <class T1, class T2>
    bool operator<(const pair<T1, T2>& x, const pair<T1, T2>& y);
    
    Returns: x.first < y.first || (!(y.first < x.first) && x.second < y.second).
    

    【讨论】:

    • 为什么他们不使用更简单的 (y.first >= x.first) 而不是 less + negation ?
    • @PatrickRoncagliolo 这种方式只需要用户自定义类型实现operator&lt;即可支持排序。否则他们需要支持更多的排序运算符,并确保它们之间的关系(例如&gt;=&lt;的否定)。
    • 所以这不是某种与
    【解决方案2】:

    根据我的 C++0x 标准副本第 20.3.3.26 节,std::pair 定义了一个 operator&lt;,这样对于两对 x 和 y,它会返回

    x.first < y.first || (!(y.first < x.first) && x.second < y.second)
    

    我不确定这是否也是 2003 年标准的一部分。我还应该注意,如果元素本身不是 LessThanComparable,则不会编译。

    【讨论】:

      【解决方案3】:

      Documentation from SGI

      比较运算符。它使用字典比较:如果 x 的第一个元素小于 y 的第一个元素,则返回值为 true,如果 y 的第一个元素小于 x 的第一个元素,则返回 false。如果这些都不是,则 operator

      看起来它实际上是两个元素的组合。

      【讨论】:

        【解决方案4】:

        是的。 operator&lt;() 是为 std::pair&lt;T1, T2&gt; 定义的,假设 T1T2 本身是可比较的。

        【讨论】:

          猜你喜欢
          • 2011-10-29
          • 1970-01-01
          • 2021-10-11
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-06-04
          • 2020-07-18
          相关资源
          最近更新 更多