Lambda表达式
Lambda表达式表示任何一个可调用的代码单元,可以理解为一个未命名的内联函数。
[捕获列表](参数列表)->返回类型(可省){函数体}
Lambda表达式采用尾置返回值的形式,也就是将表达式返回值放在->之后显示声明
捕获列表:可以理解为Lambda函数的原有变量,也就是类似于一个函数中定义的栈上的变量。
首先假定在某一函数中使用lambda表达式,例如
void func(){
auto var;
auto f = [capture list](parameter list)->return type{ function body};
}
- [] 空捕获列表,表达式不能使用func中定义的任何一个变量。
int main(){
auto f = [](const int a, const int b){ return a + b;};
cout<<f(2, 3)<<endl;
}
- [names] names用逗号分隔的名字列表,这些都是func函数中的局部变量。默认采用值捕获的方式,如果使用&,则采用引用捕获的方式。值捕获必须加上mutable才能改变被捕获变量。
int main(){
auto a = 5;
auto f = [a]() mutable { ++a;};
cout<<f()<<endl;
}
- [&]隐式捕获列表,引用捕获func中的所有变量。
- [=]隐式捕获列表,值捕获func中的所有变量。
- [&, identifier_lit]将捕获func中的所有的局部变量。identifier_list是一个逗号分隔的列表,这些变量将采用值捕获的方式;identifier_list中未列出的变量将采用引用捕获的方式。idetifier_list中变量名前面不能加&。
- [=, identifier_lit]将捕获func中的所有的局部变量。identifier_list是一个逗号分隔的列表,这些变量将采用引用捕获的方式;identifier_list中未列出的变量将采用值捕获的方式。
for_each
C++11中引入的for_each,相当于将之前冗长的for循环做了一个精简,尤其是for_each与Lambda表达式结合使用时,可以让代码变得更简洁,语义更明确。
例如 车库里放着编号为1,2,….. ,n的汽车。
- 范围for表达式
for(auto &car : garage)
drive(car)
//把车库里的车都拿出来开一开
- for_each表达式
for_each(std::begin(garage), std::end(garage), [](car c){ drive(c);});
//把车库里的每一辆车都拿出来开上那么一开
- 传统for
for(auto car = std::begin(garage); car != std::end(garage); ++car)
{
auto& c = *car;
drive(c);
}
//把车库里的车从头到尾按顺序开一遍
- 传统for下标遍历
for(int i = 0; i < garage.size(); i++)
{
auto& car = garage[i];
drive(car);
}
//从车库里取出第一辆车,开一开
//从车库里取出第二辆车,开一开
//从车库里取出第n辆车,开一开
例:利用Lambda表达式和for_each对容器元素进行修改
int main()
{
vectoc<int> s = {1, 2, 3, 4};
for_each(s.begin(), s.end(), [=](int &c) mutable{ c++;});
}