【问题标题】:strange behavior while sorting vector of pairs对向量进行排序时的奇怪行为
【发布时间】:2021-06-26 12:28:01
【问题描述】:

我正在用非负整数填充以下向量以解决代码堵塞问题:

vector<pair<int,pair<int,int> > > v;

以下排序方式提交失败:

sort(v.begin(),v.end(),[](auto a,auto b){
    return a.first < b.first;
});

但是如果我只是改变排序如下:

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

提交通过。

我用于排序的 lamda 函数有什么问题?

谢谢

【问题讨论】:

  • 你为什么只在你的 lambda 中比较 firstpair 也有一个 second 成员。
  • “出了什么问题”取决于您想要实现的目标。您的 lambda 只考虑第一个元素,但 std::pair's default comparison operator 比较两个元素。
  • @NathanOliver。 vector 的每个元素都是一个间隔(开始分钟和结束分钟)。排序后我还需要知道原始索引,所以我将它存储在内部对中。 [开始,(结束,索引)]。我需要知道重叠的间隔,所以我只在间隔的开始时间对其进行排序。
  • 谢谢@churill。这个链接很有帮助。
  • 下次请说得更具体一些,比如“提交”的意思。 “程序生成正确/错误”结果会提供更多信息。在我阅读接受的答案之前,我确信您谈到了编译错误。

标签: c++ vector stl std std-pair


【解决方案1】:

您的 lambda 只考虑第一个元素,但显然一对由两个元素组成。对于具有相同第一个但不同的第二个元素的 lambda 对,将被视为相等。因此它们在排序后的相对顺序是未指定的。

如果要对数据进行如下排序:

{1, {1, 1}},
{0, {2, 2}},
{1, {3, 3}},

那么第一项和最后一项被认为是相等的,排序可以产生

{0, {2, 2}},
{1, {1, 1}},
{1, {3, 3}},

{0, {2, 2}},
{1, {3, 3}},
{1, {1, 1}},

但是std::pair's default comparison operator比较第一个第二个元素。

【讨论】:

  • 优秀的答案。再好不过了。非常感谢。
猜你喜欢
  • 1970-01-01
  • 2023-04-08
  • 2020-02-07
  • 1970-01-01
  • 1970-01-01
  • 2011-03-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多