1

我正在练习 lambdas:

 int main()
 {
    std::vector<int> v {1,2,3,4};
    int count = 0;
    sort(v.begin(), v.end(), [](const int& a, const int& b) -> bool
        {
        return a > b;
        });
  }

这只是 GeeksForGeeks 的代码,按降序排序,没什么特别的。我添加了一些打印语句(但在这篇文章中将它们取出)以查看 lambda 内部发生了什么。他们打印整个向量,以及ab值:

1 2 3 4  
a=2 b=1

2 1 3 4  
a=3 b=2

3 2 1 4  
a=4 b=3

4 3 2 1 <- final

所以我更详细的问题是:向量元素传递到aandb参数的顺序背后的逻辑是什么?

迭代时是否b永久位于索引处?如果是这样,传递给 lambda 的第二个参数停留在第一个元素是不是有点奇怪?它是特定于编译器的吗?谢谢!0a

4

4 回答 4

1

通过将谓词传递给std::sort(),您正在指定您的排序标准。对于您指定的排序标准,true如果第一个参数 (ie, ) 在第二个参数 (ie, a)之前,则谓词必须返回。b

因此,对于您的谓词:

return a > b;

如果a大于,则将在前_ _ba b


所以我更详细的问题是:向量元素传递到aandb参数的顺序背后的逻辑是什么?

a并且b只是您要传递给的元素的成对元素std::sort()。“逻辑”将取决于实现的底层算法std::sort()。由于随机化,对于具有相同输入的调用,这些对也可能不同。

于 2019-01-05T08:57:21.840 回答
1

'a' 迭代时,'b' 是否永久位于索引 0?如果是这样,传递给 lambda 的第二个参数停留在第一个元素是不是有点奇怪?

不,因为第一个元素更高。

似乎,使用这种算法,所有元素都被检查(并且可能切换)较高的元素(在第一轮),并且较高的元素被放置在第一个位置;所以b永远指向更高的。

于 2019-01-03T20:55:13.990 回答
1

对于 Visual Studio,如果子数组大小 <= 32 个元素,则 std::sort 使用插入排序。对于较大的子数组,它使用介绍排序,这是快速排序,除非“递归”深度太深,在这种情况下它会切换到堆排序。您程序生成的输出似乎对应于插入排序的某些变体。由于比较函数是“小于”,并且由于左值“大于”右值,插入排序正在寻找乱序,因此交换了输入参数。

于 2019-01-03T22:35:03.750 回答
0

您只需使用给定的顺序比较两个元素。这意味着如果顺序是athen b,那么 lambda 必须返回true

aor是b数组的第一个或最后一个元素,或者是固定的,这取决于排序算法,当然也取决于您的数据!

于 2019-01-03T20:49:52.103 回答