C++:lamba表达式

介绍

Lambda表达式是现代C++(C++11及更高版本)中引入的一项特性,用于定义并创建匿名的函数对象,以简化编程工作。Lambda表达式提供了一种便捷的方式在需要函数对象的地方直接编写函数体,而无需显式定义一个独立的函数或函数对象。以下是对Lambda表达式的详细解释:
Lambda表达式的语法形式如下:

[captures](params) mutable exception_spec -> return_type { body }

captures(捕获列表):用来说明外部变量的访问方式,可以是值传递(=)或引用传递(&),还可以指定捕获特定变量或全部变量。
params(参数列表):与普通函数的参数列表相同,如果不需要参数,则可以省略括号。
mutable:一个可选的修饰符,用于允许在Lambda表达式内部修改捕获的变量(默认情况下,Lambda表达式是const的,不允许修改捕获的变量)。
exception_spec:异常说明,这部分在C++标准中并未明确支持,因此在实际编程中通常省略。
return_type:返回类型,如果Lambda表达式的返回类型可以通过函数体自动推导出来,则可以省略该部分。
body(函数体):包含Lambda表达式的实现,这部分不能省略,但函数体可以为空。

lambda表达式之参数捕获

什么是参数捕获
(1)实验:在lambda表达式外面定义int a,在表达式内部试图访问
(2)解决:在[]中增加捕获说明即可
(3)总结:所谓参数捕获,就是让lambda表达式内部可以捕获并使用外部的变量

ambda表达式的捕获列表
(1)[] 空,完全不捕获
(2)[=] 等号,以值传参方式捕获,捕获范围是表达式所在作用范围(包括所在类的this)
(3)[&] &号,以引用传参方式捕获,捕获范围是表达式所在作用范围(包括所在类的this)
(4)[this] 只捕获lambda表达式所在类的this可访问的那些
(5)[a] 仅以值方式捕获a,其他全部不捕获
(6)[&a] 仅以引用方式捕获a,其他全部不捕获
(7)[a, &b] 仅以值方式捕获a,以引用方式捕获b,其余完全不捕获
(8)[=, &a, &b] 仅以引用方式捕获a和b,其余以值方式捕获
(9)[&, a, b] 仅以值方式捕获a和b,其余以引用方式捕获

实例

#include <iostream>  
#include <vector>  
#include <algorithm>  
  
int main() {  
    std::vector<int> vec = {1, 2, 3, 4, 5};  
  
    // 使用Lambda表达式对vec中的每个元素加1  
    std::for_each(vec.begin(), vec.end(), [](int& x) { x += 1; });  
  
    // 使用Lambda表达式和std::cout输出vec中的每个元素  
    std::for_each(vec.begin(), vec.end(), [](int x) { std::cout << x << " "; });  
  
    return 0;  
}

第一个std::for_each调用了一个Lambda表达式,该表达式接受一个整型引用参数x,并将其值加1。第二个std::for_each调用了另一个Lambda表达式,该表达式接受一个整型参数x(按值传递,因此不会修改原始容器中的元素),并使用std::cout输出该值。

总结

lambda的捕获只向外突破一层
值传递就是讲变量复制一下后使用,在lambda的捕获中会将变量修改为const类型的变量
引用传递,就是直接修改内存内容

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

li星野

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值