【问题标题】:Understand the sorting of a vector of pair (int and pointer to object)理解对向量的排序(int和指向对象的指针)
【发布时间】:2021-09-26 16:57:55
【问题描述】:

我有一个定义如下的pair向量:

vector<pair<int, myClass *>> myVector;

使用以下方式对向量进行排序:

sort(myVector.begin(), myVector.end());

这段代码不是我的,一切正常。

我唯一不明白但我想了解的是:

当我的向量中有两个元素具有与第一个相同的 int 值时,如何进行排序?依据什么标准?

我首先想到的是,它基于指向我的对象的指针的值。但是我看不到。

我想理解它,因为我需要在 Matlab 上的演示器上重现这种行为(排序)。

【问题讨论】:

  • 答案在手册中,因为它经常发生在operator==,!=,<,<=,>,>=,<=>(std::pair)
  • 看看std::pair::operator&lt;是如何定义的。
  • 指向两个独立创建的对象的指针是不可比较的,即使实现可以比较它们,结果也毫无意义——您(通常)无法控制分配。所以你可以假设第一个组件相同的项目是随机排序的。
  • 感谢您的回答。我看着它,但仍然无法弄清楚。我的第二个是具有多个属性的对象(其他对象的向量、结构、迭代器、布尔值)。对于具有相同int的排序元素,我检查了第二个的每个值,找不到逻辑。
  • @CiaPan:这个过程是重复的,首先相等的项目总是按相同的顺序排列。但我找不到模式。

标签: c++ sorting std-pair


【解决方案1】:

std::sort 使用 std::less 作为默认比较器。对于只调用元素operator&lt; 并根据first 排序的std::pair,然后是second。详情见这里:https://en.cppreference.com/w/cpp/utility/pair/operator_cmp

但是,通过&lt; 比较未指向同一数组元素的指针是实现定义的。一般来说,您需要使用std::less 来正确比较指针。

因此,具有相同first 的元素的顺序是实现定义的,难以准确复制。

【讨论】:

    【解决方案2】:

    正如我在对我的问题的评论中所说,tt 确实是用作第二个排序参数的指针的数值。这种行为在程序本身中没有任何意义(再一次,不是我的程序),但它在 Matlab 中也无法重现。无论如何,谢谢大家的帮助。

    【讨论】:

      【解决方案3】:
      sort(A.begin(), A.end(), 
      []( pair<int, myClass *> p1, pair<int, myClass *>p2 )  
      { return p1.first < p2.first; });
      

      根据您的意愿或您希望排序发生的方式修改 lambda。

      【讨论】:

        猜你喜欢
        • 2014-12-29
        • 2021-09-20
        • 1970-01-01
        • 1970-01-01
        • 2011-10-01
        • 1970-01-01
        • 2011-02-11
        • 1970-01-01
        • 2017-09-14
        相关资源
        最近更新 更多