【问题标题】:sorting STL container with pair of pairs用对对 STL 容器进行排序
【发布时间】:2019-04-12 14:31:42
【问题描述】:

这是我第一次使用 C++ STL priority_queue(),我对遇到的这段特定代码有点困惑(但我相信这与 pq 无关,它应该适用于所有容器(向量、集合等)):

priority_queue<pair<int, pair<int, int> >,
            vector<pair<int, pair<int, int> > >,
            greater<pair<int, pair<int, int> > > > pq;

假设我有pq.push_back(make_pair(a,make_pair(b,c)))。如果a发生冲突,那么比较规则是否会扩展到第二对,并根据b然后c进行排序?

【问题讨论】:

  • 你不想用std::tuple&lt;int, int, int&gt; 代替pair&lt;int, pair&lt;int, int&gt;&gt; 吗?
  • @Jarod42 :是的,这在大多数情况下可以达到目的,但这只是为了澄清概念,我确实发现有人以这种方式实现它。 (为了建议有人避免使用三元运算符,我必须首先了解什么是三元运算符?:) 因此,我发布了此内容以进行澄清。希望它也能帮助未来的访客)

标签: c++ c++11 stl


【解决方案1】:

问题基本上归结为:std::pairs 是如何排序的,即a &gt; b 对两对的结果是什么(注意std::greater 只是调用operator&gt;)。

来自cppreference std::pair::operator&gt;:

按字典顺序比较lhs和rhs,即比较第一个 元素,并且只有当它们相等时,才比较第二个 元素。

这自然会扩展到嵌套对。因此...

假设我有 pq.push_back(make_pair(a,make_pair(b,c)))。如果 有冲突,那么比较规则会延伸到 第二对和排序将在b的基础上进行,然后是c?

是的。如果两个元素的a 相等,则将比较最外层对的second(即(b,c))。

【讨论】:

    【解决方案2】:

    如果a发生冲突,那么比较规则是否会扩展到第二对,并在b的基础上进行排序,然后是c?

    没错。 std::greater 默认为operator &gt;,在std::pair 的情况下,implements lexicographical comparison - 即比较第一个,如果第一个重合,则比较第二个。

    【讨论】:

      【解决方案3】:

      priority_queue 类需要比较方法。默认使用std::less,但您可以覆盖它。

      使用std::pair 将暗示使用std::pair 使用的默认比较:http://www.cplusplus.com/reference/utility/pair/operators/

      我认为这应该回答您的问题。

      【讨论】:

        【解决方案4】:

        你是对的:成对的对按 (a, b, c) 上的字典顺序排序。 看看std::greater,它实际上调用了std::pair::operator>。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2011-01-26
          • 2012-11-30
          • 2011-02-15
          • 1970-01-01
          • 1970-01-01
          • 2020-06-05
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多