一、lambda语句介绍
在cppreference中对lambda的解释是:一个能够捕获作用域中变量的未命名函数对象
个人认为就是一个用于快速定义一个匿名函数的语句
使用格式
1.capture子句,lambda的核心,通过改变[ ]中的值,来设定捕获的范围
2.参数列表 ,可选,用于确定捕获参数的类型
3.mutable,可选,用于确定捕获参数是否可以更改
4.throw(),可选,表示抛出异常
5.返回值类型,可选,表示函数体最后的返回值是什么类型的
6.函数体
二、lambda的应用
std::vector<int> v = {5,7,4,2,9,1}; sort(v.begin(), v.end(), [](int a, int b){ return a > b; }); //自定义sort的排序为降序
这里我们的捕获列表[ ]是空的,代表着不捕获任何的外部变量,也就是说,它的作用范围只在sort内
1.值捕获
即在[ ]中写入你想要捕获的变量,如下就表示我要捕获a这个变量,然后输出它
auto pr1 = [a]{std::cout << a << " " << std::endl;};
2.引用捕获
它与值捕获的区别在于,值捕获无法在函数体内修改捕获的外部变量的值,但是引用捕获可以,如下
int a = 4; auto pr1 = [a]{ std::cout << a << " " << std::endl; a++; //这里编译器会报错,是“表达式是可修改的左值” }; pr1(); auto pr2 = [&a]{ std::cout << a << std::endl; a++; //这里编译器不会报错,因为是引用捕获 };
3.通用捕获
在上述的两种中,我们都是明确了要捕获的变量,如果我们要根据函数体内的需要来捕获就可以用[=]或者[&]
其中[=]代表着值捕获,[&]代表着引用捕获
int a = 4; int b = 5; auto pr1 = [=]{ std::cout << a << " " << std::endl; std::cout << b << std::endl; }; pr1(); auto pr2 = [&]{ std::cout << a << std::endl; std::cout << ++b << std::endl; }; pr2();
当我们想在值捕获中修改的时候就需要用到mutable这样就可以在函数体内修改值
标签:std,函数,int,捕获,c++,变量,表达式,lambda From: https://www.cnblogs.com/linx000/p/17827466.html