C ++中的Lambda函数,参数和逻辑[重复]

Posted

技术标签:

【中文标题】C ++中的Lambda函数,参数和逻辑[重复]【英文标题】:Lambda function, arguments and logic in c++ [duplicate] 【发布时间】: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;);

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

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

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

    上述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 overload。 sort(begin, end, comp) 是说“对范围 [begin, end) 从最小到最大进行排序,使用 comp 来确定‘最小’的实际含义”。 【参考方案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

以上是关于C ++中的Lambda函数,参数和逻辑[重复]的主要内容,如果未能解决你的问题,请参考以下文章

C语言 函数声明和定义

C++核心编程中的函数-占位参数和默认参数

具有不同数量参数的函数中的 C++ 代码重复

C/C++中的可变参数和可变参数模板

Python:lambda表达式和yield关键字理解与使用讲解

C++20:非类型模板参数中的非捕获 lambda