lamdba表达式
// lamdab表达式语法
[捕获列表](参数列表) mutable(可选) 异常属性 -> 返回类型{
// 函数体
}
// lamdba表达式可以看作是匿名函数
// 捕获列表 参数列表 -> 返回值类型
[](int i,int j) -> int{
// 函数体
return i*j;
}
// lamdba表达式调用
int k=[](int i,int j) -> int{
return i*j;
}(1,2);
// lamdba表达式存储
auto f1=[](int i,int j) -> int{
return i*j;
};
f1(1,2);
// lamdba表达式嵌套
// 如果不写lamdba表达式返回类型,编译器会自动推导
[](int i){
return [i](int j){
return i*j;
}(10);
}(20);
// lambda表达式嵌套存储
auto f=[](int i){
return [i](int j){
return i*j;
};
};
f(1)(2);
int i=2;
// 按值捕获 不会修改外部的变量
// 想要修改按值捕获的值要加上mutable关键字
//加上 mutable 修饰符后,可以修改传递进来的拷贝(注意是能修改拷贝,而不是值本身)。exception 声明用于指定函数抛出的异常,如抛出整数类型的异常,可以使用 throw(int)
auto f=[i]() mutable{
return ++i;
};
cout<<f()<<endl; // 3
cout<<f()<<endl; // 4
cout<<f()<<endl; // 5
cout<<i<<endl; //2
// 当使用mutable按值捕获时,每次都使用声明的时候的拷贝
int i=1;
// 按值捕获时捕获的是声明匿名函数时,捕获列表参数的值
auto f=[i](){
std::cout<<i<<std::endl;
};
i=2;
f(); // 1
// 引用捕获 会修改外部的值 外部修改也会影响内部
int i=1;
auto f=[&i](){
std::cout<<i<<std::endl;
i=2;
};
i=3;
f(); // 3
// 捕获列表
int i=1;
int j=2;
int k=3;
int m=4;
// 按值捕获所有变量
[=](){
// 函数体
};
// 按引用捕获所有变量
[&](){
// 函数体
};
// 引用和值捕获
[i,j,&k,&m](){
// 函数体
};
// =,&a,&b:除 a 和 b 按引用进行传递外,其他参数都按值进行传递
// &,a,b:除 a 和 b 按值进行传递外,其他参数都按引用进行传递
vector<int> v={1,2,3,4,5,6,7,8,9};
for_each(v.begin(),v.end(),[](int n){
cout << n <<endl;
});