【问题标题】:Lambda function, arguments and logic in c++ [duplicate]C ++中的Lambda函数,参数和逻辑[重复]
【发布时间】:2021-11-16 23:47:34
【问题描述】:

我不熟悉在 C++ 中使用 lambda 函数。我一直在研究网络,找到了几篇解释 lambda 函数的语法和用途的文章,但我没有找到明确解释如何编写 lambda 函数的内部逻辑的文章。

例如

在 c++ 中按降序对向量进行排序时:

sort(v1.begin(), v1.end(), [](const int &a, const int &b){return b < a;});

我写了上面的代码。在这里,我有几个问题:

  1. 为什么我在 lambda 函数中只提供两个参数?为什么不是三个?或者我为什么不给出所有的 n 参数(n 是向量的大小)并做一个逻辑?我不是要找到最多两个元素,而是要对向量进行排序,为什么只考虑两个值?

  2. 为什么 a > b 是降序排列?为什么不是 b > a? lambda 函数内部是否有任何排序?

  3. 上述lambda函数的返回值是false(0)还是true(1)?为什么我只需要返回 false(0) 或 true(1) 来排序?为什么我不能返回一个字符进行排序,比如让我们假设返回值 'a' 它是升序的,而返回值 'd' 它是降序的?

再次

在寻找最大偶数元素时

itr = max_element(v1.begin(), v1.end(), [](const int &a, const int &b){
            if (isEven(a) && isEven(b)) {
                return (a < b);
            } else
                return false;
        }
        );

我要返回 b > a。而不是a大于b。 ???

任何建议将不胜感激。

【问题讨论】:

  • 听起来你可以使用good C++ book。您的许多问题以及更多问题都包含在其中。
  • 这些问题中的大多数并不是关于 lambda 的,而是关于 std::sort 的第三个参数。具体来说,这里是third overloadsort(begin, end, comp) 是说“对范围 [begin, end) 从最小到最大进行排序,使用 comp 来确定‘最小’的实际含义”。

标签: c++ function c++11 lambda stl-algorithm


【解决方案1】:

您的问题与 lambdas 无关,而是与 std::sort 函数有关。

确实,如果您阅读有关第三个参数(比较函数,在您的情况下为 lambda)的文档,它会说:

比较函数对象,如果第一个参数是则返回真 小于(即先于)第二个。

比较函数的签名应该等同于 以下:

bool cmp(const Type1 &a, const Type2 &b);

确实,不需要创建 lambda 来将其作为第三个参数传递。您可以传递任何接收两个 T 类型参数(容器元素之一)并返回 bool 的函数对象。

例如,你可以这样做:

#include <vector>
#include <algorithm>
#include <iostream>

struct  {
    bool operator () (int a, int b){
        return a > b;
    }
}my_comp;



int main(){
    std::vector<int> v={1,2,3};

    std::sort(v.begin(), v.end(), my_comp);


    for(auto e:v) std::cout << e << " ";
    std::cout << std::endl;

}

【讨论】:

  • my_comp::operator() 应该是const
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-08-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-14
相关资源
最近更新 更多