【lambda函数】lambda()函数

这篇具有很好参考价值的文章主要介绍了【lambda函数】lambda()函数。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

lambda()语法

lambda表达式书写格式:

[capture-list] (parameters) mutable -> return-type
 { 
	 statement
}

咱们一个个来解释:
[capture-list] :捕捉列表,该列表总是出现在lambda函数的开始位置,编译器根据 [] 来判断接下来的代码是否为lambda函数,捕捉列表能够捕捉上下文中的变量供lambda函数使用。不能省略

(parameters): 参数列表,与普通函数的参数列表一致,如果不需要参数传递,则可以连同()一起省略

mutable: 默认情况下,lambda函数总是一个const函数,mutable可以取消其常量性。使用该修饰符时,参数列表不可省略(即使参数为空)。

-> return-type:返回值类型,用追踪返回类型形式声明函数的返回值类型,没有返回值时此部分可省略。返回值类型明确情况下,也可省略,由编译器对返回类型进行推导。

statement:函数体,在该函数体内,除了可以使用其参数外,还可以使用所有捕获到的变量。不可省略

因此,把可以省略的都省略掉,最那简单的lambda函数是 []{} ,该 lambda 表达式没有任何意义。该lambda函数不能做任何事情。

接下来写一个lambda函数:

auto add = [](int x, int y)->int
    {
        return x + y;
    };

lambda表达式实际上可以理解为无名函数,该函数无法直接调用,如果想要直接调用,可借助auto将其赋值给一个变量。
调用:

	//第一种
    add(10, 20);
    //第二种
    [](int x, int y)->int {return x + y;}(10, 20);
	

可以看出,lambda函数和普通函数在组成和调用上都很相似。参数列表,返回值,函数体都不在多叙述。

捕捉列表

捕捉列表描述了上下文中那些数据可以被lambda使用。

如:

    int a = 10;
    int b = 20;

    auto add = [a,b]() 
    {
        return a + b ;
    };

直接捕捉了 a b 变量,且是传值捕捉,lambda函数体内的a, b变量,只是外边 a b 的一份拷贝。且默认无法修改。
【lambda函数】lambda()函数,c++
要想修改,可以使用 mutable 进行修饰。

mutable

如:

auto add = [a, b]() mutable
    {
        a = 20;
        return a + b;
    };

【lambda函数】lambda()函数,c++

就不会报错,但因为是传值,所以lambda 函数内部 a的变化,无法影响外部的a变量。

mutable 用的比较少。

当然,lambda函数 和普通函数一样,捕捉列表,可以传值捕捉,也可以传引用捕捉。

    int x = 10;
	int y = 20;
	//捕捉列表

	//传引用   参数列表
	auto fun1 = [](int& x, int& y) {
		int tmp = x;
		x = y;
		y = x;
	};
	
    // 传引用捕捉   
	auto fun2 = [&x,&y]() {
		int tmp = x;
		x = y;
		y = x;
	};
	
    //对上下文所有变量进行传引用捕捉
	auto fun3 = [&]() {
		x = y;
	};
	
	//对除y以外的所有变量传引用捕捉,y传值捕捉
	auto fun4 = [&, y] {
		;
	};
	
    //对y进行传值捕捉,对其余变量进行传引用捕捉
	auto fun5 = [=, &y] {
		;
	};

lambda 底层原理

看如下代码:

int main()
{
    int a = 10;
    int b = 20;

    auto add = [a, b]() mutable
    {
        a = 20;
        return a + b;
    };

    cout << typeid(add).name() << endl;
    cout << sizeof(add) << endl;
	return 0;
}

lambda 函数的类型变量是什么呢?
lambda 类型的大小又是多少呢?

【lambda函数】lambda()函数,c++

从运行结果上来看,其大小为一,类型大致为一个类,具体是什么我们现在也不清楚。

函数对象与lambda表达式

函数对象,又称为仿函数,即可以想函数一样使用的对象,就是在类中重载了operator()运算符的类对象。

//仿函数
class math {
public:
    int operator() (int x, int y)
    {
        return x + y;
    }
};

int main()
{
    int a = 10;
    int b = 20;
    //仿函数对象
    math m;
    //lambda函数
    auto add = [](int a,int b) 
    {
        return a + b;
    };
    
    m(a, b);
    add(a, b);
	return 0;
}

我们从反汇编上来看,
仿函数底层代码,调用了 重载的 ()
【lambda函数】lambda()函数,c++

lambda() 函数的底层:
【lambda函数】lambda()函数,c++
我们也可以看出,也是调用了一个lambda 类里的重载的()

不妨看出,lambda()函数的底层就是一个重载了()的空类。

所以就可以知道,lambda类型的大小为1了:

因为,它的底层是一个空类,是一个仿函数。

至于它的类型,如图:
【lambda函数】lambda()函数,c++

也就是,上图是 lambda_UUID
UUID 是 通用唯一识别码(Universally Unique Identifier)的缩写,是通过一种特殊的算法计算出来的具有唯一识别信息的 数据。

也就是说,每一个lambda()对象的类型都不一样。
也就不存在不同lambda()对象相互赋值的情况。

结语
本次的博客就到这了。

我是Tom-猫,
如果觉得有帮助的话,记得
一键三连哦ヾ(≧▽≦*)o。

咱们下期再见。

【lambda函数】lambda()函数,c++文章来源地址https://www.toymoban.com/news/detail-536791.html

到了这里,关于【lambda函数】lambda()函数的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Python中的Lambda函数

    Python中的Lambda函数是一种小型匿名函数,它是通过 lambda 来定义的。Lambda函数可以接受任意数量的参数,但只能有一个表达式。 Lambda函数的语法非常简单,基本形式如下: 这里的 arguments 是函数的参数,可以有多个,用逗号分隔。 expression 是一个关于参数的表达式,这

    2024年02月21日
    浏览(21)
  • python匿名函数Lambda

    Lambda函数也被称为匿名(没有名称)函数,它直接接受参数的数量以及使用该参数执行的条件或操作,该参数以冒号分隔,并返回最终结果。为了在大型代码库上编写代码时执行一项小任务,或者在函数中执行一项小任务,便在正常过程中使用lambda函数。 argument_list是参数列表,

    2024年02月16日
    浏览(33)
  • AWS Lambda函数实战

    实战效果:开发一个函数,它会关注事件中的某个名字,并返回“Hello名字!”。如果输入事件没有提供名字,则函数返回一个更加通用的问候语“Hello World!”。 AWS Lambda接口可以通过AWS命令行或可在服务器、浏览器及移动设备上运行的AWS软件开发包(SDK)来调用。 首先要在

    2024年01月22日
    浏览(35)
  • lambda匿名函数

    问题: 什么是lambda函数?它有什么好处?举例说明 解答 含义 在Python中,不通过def来声明函数名字,而是通过 lambda 来定义的函数称为匿名函数,即函数没有具体的名称,你可以理解为 一句话写一个函数 Lambda表达式是Python中一类特殊的定义函数的形式,从语义上讲,它们

    2024年02月15日
    浏览(37)
  • Kotlin Lambda和高阶函数

    本文链接: 1、lambda的由来 单词\\\"lambda\\\"源于希腊字母λ(小写lambda) \\\"Lambda\\\"一词最早起源于数学中的λ演算(lambda calculus),它是一种函数定义和函数应用的形式系统,由逻辑学家阿隆佐·邱奇(Alonzo Church)在20世纪30年代发明。 邱奇使用λ作为演算中的一个操作符,用于表示匿

    2024年02月12日
    浏览(22)
  • C++匿名函数lambda详解

    语法规则:lambda表达式可以看成是一般函数的函数名被略去,返回值使用了一个 - 的形式表示。唯一与普通函数不同的是增加了“捕获列表”。 编译(要指定-std=c++11): 输出结果: 一般情况下,编译器可以自动推断出lambda表达式的返回类型,所以我们可以不指定返回类型,

    2024年02月04日
    浏览(22)
  • Python 函数:定义、调用、参数、递归和 Lambda 函数详解

    函数是一段代码块,只有在调用时才会运行。您可以将数据(称为参数)传递给函数。 函数可以返回数据作为结果。 在Python中,使用def定义函数: 示例 要调用函数,请使用函数名称后跟括号: 示例 可以将信息作为参数传递给函数。参数在函数名称后面的括号内指定

    2024年02月08日
    浏览(30)
  • 【C++】STL 算法 ② ( foreach 循环中传入 函数对象 / Lambda 表达式处理元素 | foreach 循环算法 | Lambda 表达式 - 匿名 函数对象 / 仿函数 )

    在 C++ 语言中 , std::foreach 循环 虽然 不是标准库的一部分 , 但是 C ++ 编译器 提供了对 该语法 的支持作为扩展 ; 使用 该 std::foreach 循环 , 可以用于 遍历 STL 标准模板库 中提供的容器 , 如 vector 单端数组 , list 双向链表 , map 映射 , set 集合 等 容器 中的元素 ; std::for_each 是一个算

    2024年02月02日
    浏览(37)
  • Python 函数(lambda 匿名函数、自定义函数、装饰器)基本使用指南

    函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段 对于单行函数,使用 lambda 表达式可以省去定义函数的过程,让代码更加简洁; 对于不需要多次复用的函数,使用 lambda 表达式可以在用完之后立即释放,提高程序执行的性能。 格式: 一般形式 含 if

    2024年02月08日
    浏览(29)
  • 使用AWS Lambda函数的最佳实践!

    主题 函数代码 函数配置 指标和警报 处理流 安全最佳实践 有关 Lambda 应用程序最佳实践的更多信息,请参阅 Serverless Land 中的 Application design。 从核心逻辑中分离 Lambda 处理程序。这样您可以创建更容易进行单元测试的函数。在 Node.js 中可能如下所示: 利用执行环境重用来提

    2024年02月07日
    浏览(24)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包