c++0x 学习笔记之 lambda(一)

2014-11-24 13:03:46 · 作者: · 浏览: 2

by feng

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

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

再比如

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) 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 中。

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

<script type="text/java script">BAIDU_CLB_fillSlot("771048");
点击复制链接 与好友分享! 回本站首页
<script> function copyToClipBoard(){ var clipBoardContent=document.title + '\r\n' + document.location; clipBoardContent+='\r\n'; window.clipboardData.setData("Text",clipBoardContent); alert("恭喜您!复制成功"); }
分享到: 更多
<script type="text/java script" id="bdshare_js" data="type=tools&uid=12732"> <script type="text/java script" id="bdshell_js"> <script type="text/java script"> var bds_config = {'snsKey':{'tsina':'2386826374','tqq':'5e544a8fdea646c5a5f3967871346eb8'}}; document.getElementById("bdshell_js").src = "http://bdimg.share.baidu.com/static/js/shell_v2.js cdnversion=" + Math.ceil(new Date()/3600000)
您对本文章有什么意见或着疑问吗?请到 论坛讨论您的关注和建议是我们前行的参考和动力
上一篇: C++0x 学习笔记之 Variadic Templates
下一篇: c++0x 学习笔记之 range-based for loop wording
相关文章
C++0x 学习笔记之 Variadic Templates
<script type="text/java script">BAIDU_CLB_fillSlot("182716");
<script type="text/java script">BAIDU_CLB_fillSlot("517916");
图文推荐
<iframe src="http://www.2cto.com/uapi.php tid=89770&catid=339&title=YysrMHgg0afPsLHKvMfWriBsYW1iZGE=&forward=http://www.2cto.com/kf/201105/89770.html" width="100%" height="100%" id="comment_iframe" name="comment_iframe" frameborder="0" scrolling="no">
<script type="text/java script">BAIDU_CLB_fillSlot("771057");
排行
热门