浅析Lambda表达式和for_each

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<2, 3)<
  • [names] names用逗号分隔的名字列表,这些都是func函数中的局部变量。默认采用值捕获的方式,如果使用&,则采用引用捕获的方式。值捕获必须加上mutable才能改变被捕获变量。
int main(){
    auto a = 5;
    auto f = [a]() mutable { ++a;};
    cout<
  • [&]隐式捕获列表,引用捕获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++;});
}

你可能感兴趣的:(C++)