【问题标题】:How do the parameters in C++ Lambda expressions work? [duplicate]C++ Lambda 表达式中的参数如何工作? [复制]
【发布时间】:2022-01-09 22:42:21
【问题描述】:

以下面的代码为例:

std::vector<int> vec{1,2,3,4,5};
std::sort(vec.begin(), vec.end(), [](int x, int y) {return x > y; });

此代码按降序对向量进行排序,但我并不完全理解其中的机制。该向量包含 5 个元素,但参数仅包含两个变量 - int x 和 int y。我想知道当这个 lambda 表达式只接受两个变量作为参数时,它是如何对向量中的每个元素进行排序的。

【问题讨论】:

  • 我认为您只是对sort 函数的工作原理感到困惑。第三个参数是排序函数用来判断一个元素是否“小于”另一个元素的比较函数。
  • 容器的所有元素都被两个两个传递给 lambda 的这两个参数。不仅仅是前两个元素。全部。
  • Lambda 表达式不对元素进行排序:std:sort 会。为此,std::sort 需要知道给定元素是否应该按排序顺序在另一个给定元素之前或之后 - 这就是它所谓的 lambda。
  • digito_evo 是的,这正是我要问的,我只是没有正确表达它。所以它被两个两个传递给 lambda 的参数。那么我的问题是,sort 函数中的这个 lambda 表达式是否充当冒泡排序算法?因为它必须多次传递值才能实现排序向量,就像冒泡排序一样。

标签: c++ lambda


【解决方案1】:

排序函数调用中的 lambda 函数 ([](int x, int y) {return x &gt; y; }) 就像任何其他没有名称的常规函数​​一样,根据输入元素的数量被调用“N”次。

要了解更多信息,只需在该 lambda 中添加一些打印语句,如下所示。

std::vector<int> vec{1,2,3,4,5};
    
    std::sort(vec.begin(), vec.end(), [](int a, int b) {
        std::cout << "a value : " << a <<std::endl;
        std::cout << "b value : " << b <<std::endl;
        std::cout << std::endl;
        return a > b;
    });

现在输出是

a value : 2
b value : 1

a value : 3
b value : 2

a value : 4
b value : 3

a value : 5
b value : 4

因此,在我的编译器中,输入五个元素的 lamda 被调用了 4 次。

【讨论】:

  • 那么我的问题是,排序函数中的这个 lambda 表达式是否充当冒泡排序算法?因为它必须多次传递值才能实现排序向量,就像冒泡排序一样。
  • 没有。这里的 lambda 只是一个在给定两个参数时进行比较的函数。跟算法无关。
  • 标准要求时间复杂度为 O(N log N)。算法的实现留给不同的编译器。请参阅en.m.wikipedia.org/wiki/Sort_(C%2B%2B)。转到部分复杂性和实现
猜你喜欢
  • 1970-01-01
  • 2012-06-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多