捕获列表 所谓捕获列表,其实可以理解为参数的一种类型,lambda 表达式内部函数体在默认情况下是不能够使用函数体外部的变量的,这时候捕获列表可以起到传递外部数据的作用。 根据传递的行为,捕获列表也分为以下几种: 1. 值捕获 与参数传值类似,值捕获的前期是变量可以拷贝,不同之处则在于,被捕获的变量在 lambda 表达式被创建时拷贝,而非调用时才拷贝:
#include <iostream>
using namespace std;
int main() {
int t = 10;
auto f=[t]() mutable{
cout << t << endl;
return t;
};
t = 11;
f();
}
2. 引用捕获 与引用传参类似,引用捕获保存的是引用,值会发生变化。
#include <iostream>
using namespace std;
int main() {
int t = 10;
auto f2 = [&t]() mutable {
cout << t << endl;
t = 13;
return t;
};
t = 11;
f2();
cout << t << endl;
}
运行结果: 3. 隐式捕获 手动书写捕获列表有时候是非常复杂的,这种机械性的工作可以交给编译器来处理,这时候可以在捕获列表中写一个 & 或 = 向编译器声明采用 引用捕获或者值捕获. 总结一下,捕获提供了 Lambda 表达式对外部值进行使用的功能,捕获列表的最常用的四种形式可以是: (1)[] 空捕获列表; (2)[name1, name2, …] 捕获一系列变量; (3)[&] 引用捕获, 让编译器自行推导捕获列表; (4)[=] 值捕获, 让编译器执行推导应用列表;
int a = 1;
int b = 2;
[=]() {
cout << a << "+" << b << endl;
}();
[&]() {
cout << a++ << "+" << b++ << endl;
}();
[a,&b]() {
cout << a<< "+" << b<<endl;
}();
4. Lambda 表达式的应用 利用stl中迭代写法for_each进行动态数组内元素奇偶数的判断。
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main()
{
vector<int>v = {1,2,3,4,5};
for (int i=0;i<v.size();i++)
{
if (v[i] % 2 == 0)
{
cout << v[i] << "是偶数" << endl;
}
else {
cout << v[i] << "是奇数" << endl;
}
}
for_each(v.begin(), v.end(), [](int n) {
if (n % 2 == 0)
{
cout << n << "是偶数" << endl;
}
else {
cout << n << "是奇数" << endl;
}
});
return 0;
for (auto it = v.begin(); it != v.end(); it++)
{
[&](int n) {
if (n % 2 == 0)
{
cout << n << "是偶数" << endl;
}
else {
cout << n << "是奇数" << endl;
}
};
}
}
迭代器:C++新特性03_迭代器iterator及类型推导auto 5.学习视频地址: Lambda 表达式/匿名函数捕获列表及应用 6.学习笔记:Lambda 表达式/匿名函数捕获列表及应用笔记
|