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) |
需要特别说明的是,只有当 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 以引用传入,相当于计算
并将结果存入 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");
- 排行
- 热门
- 145 | C++ STL学习之三:容器deque深入学习
- 115 | C/C++之define用法小结
- 110 | cocos2d-x CCRotateTo 对初始角,旋
- 105 | 利用ffmpeg解码h264流的代码
- 102 | ios面试题收集一(附基本答案)
- 92 | c++模板详解
- 89 | WinExec()和system()的区别
- 82 | 利用栈实现十进制数数制转换成其他进制




