当前位置:编程学习 > C/C++ >>

c++0x 学习笔记之 lambda

by feng

有了 lambda 的支持之后,写一些函数式的代码更加方便了,比如

1
2
3
std::vector<int> vec;
std::for_each( vec.begin(), vec.end(),
               [](int i){ std::cout <<i << " "; } );

再比如

1
2
std::sort( vec.begin(), vec.end(), [](int i, int j)
           { return std::abs(i) < std::abs(j); } );

其中的

1
[](int i, int j){return std::abs(i) < std::abs(j);}

就是一个 lambda 对象。这个匿名对象返回的类型是

1
decltype(std::abs(j)<std::abs(j))

需要特别说明的是,只有当 lambda 对象中有 return expression 时,返回类型才可以忽略,否则就是 void。因此,这个 lambda 对象完全写下来是这样的:

1
2
[](int i, int j) -> bool
{ return std::abs(i) < std::abs(j); }

这其中的 [] 称为 lambda 导引符(lambda-introducer),里边可以是空的,也可以有几个变量名称:


[] // 未定义任何参数
[x, &y] // x 以值传入,y 以引用传入
[&] //所有外部参数皆以引用传入
[=] // 所有外部参数皆以值传入
[&, x] // x 以值传入,其余以引用传入
[=, &z] // z 以引用传入,其余以值传入

下边是一个使用外部参数的例子

1
2
3
4
std::vector<double> arr;
double sum = 0;
std::for_each( arr.begin(), arr.end(),
               [&sum](double d){ sum += std::exp(d); } );

其中 sum 以引用传入,相当于计算

S = sum_{i=1}^{i=N} e^{A_i}

并将结果存入 sum 中。

当然,上边也可直接抓取所有外部参数的引用做简化,这在参数很多的时候很有用

 

补充:软件开发 , C++ ,
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,