文档章节

C++11 lambda 表达式

刘大神
 刘大神
发布于 2015/05/25 16:51
字数 698
阅读 688
收藏 12

                                    C++11 lambda表达式

 

        在C++ 03标准中,并没有lambda这个概念,对于C++来说,boost库提供了lambda的接口。在C++11中,引进了lambda表达式,这也可能是面向对象语言中,比较晚引进这个概念的语言吧。

        在C++中,lambda表达式就像是一个匿名函数,保持状态,并可以访问封闭范围内可用的变量。许多编程语言都支持匿名函数这个概念,像C#,Java 8 ,Python等语言;C++语言就像是一个匿名函数,有函数体,但是没有函数名称。该函数是一次执行的,这样,既方便了自己编程,也拒绝了其他人的访问,安全性也得到提高。

        下面说说lambda表达式的构成:

 1: void AbsSort(float *x, unsigned n)
 2: {
 3:     std::sort(
 4:         x, x + n,
 5:         [](float a, float b)             //lambda表达式的引入标识
 6:         {
 7:             return std::abs(a) > abs(b) ? abs(a) : abs(b);
 8:         });
 9: }

1,lambda引入了一个“[ ]”标志,在标志里面可以填“&”,“=”,也可以像上述例子中不填。在括号中的标志,表示lambda捕获的数据是什么形式的;在通常情况下,这个“&”表示引用的方式,“=”表示赋值的方式。ps:这里面有一点需要说明,就是引用和赋值的异同,不明白的童鞋请自行百度,google,或者看书脑补。

2.在“[ ]”后面,括号中的 则是lambda的参数和参数类型,剩下的就是函数体了。这个要是看不懂的话,请翻书重新阅读。

 

 

基础的东西介绍完了,那我们来说说,lambda表达式是怎么和stl算法一起使用的:

 1: int main()
 2: {
 3:     char *a = {1,4,6,2,3,5,9,7,8,0};
 4:     std::sort(a,a+10);
 5: 
 6:     for_each(a, a+10, [&](int i){ cout<< i <<" "; });
 7: 
 8:     return 0;
 9: 
 10: }

这里面的for_each 的作用是循环遍历。有兴趣的童鞋可以考虑考虑 把lambda标志”[ ]”里面的“&”改成“=”,看看输出的结果是否一样。

 

再来看看lambda的嵌套,类似于for循环的嵌套哦:

 1: int main()
 2: {
 3:    int m = [](int x)
 4: 
 5:       { return [](int y) { return y + 5; }(x) + 3; }(5);
 6: 
 7:    std::cout << m << std::endl;
 8:    
 9:    return 0;
 10: }

在这个嵌套中,童鞋们思考几个问题,这个例子和上面的几个例子哪些方面存在不同,还有就是,lambda的参数是怎么传递的??

 

 

 

总结:lambda表达式其实就是个语法糖,它并没有增加编程语言的功能,只是增加代码的可读性(貌似对于没有接触过这种语法的人,应该是减少了代码的可读性),以上纯属个人能心得,如有错误,欢迎指正。

© 著作权归作者所有

刘大神
粉丝 8
博文 21
码字总数 18133
作品 0
朝阳
高级程序员
私信 提问
加载中

评论(2)

刘大神
刘大神 博主

引用来自“f0rb”的评论

第二个例子main写成mian了。。。。。。

@f0rb 额,一时疏忽了,马上改
f0rb
f0rb
第二个例子main写成mian了。。。。。。
【C++11】lambda 表达式解析

C++11 新增了很多特性,lambda 表达式是其中之一,如果你想了解的 C++11 完整特性,建议去这里,这里,这里,还有这里看看。本文作为 5 月的最后一篇博客,将介绍 C++11 的 lambda 表达式。 ...

筱骏
2017/03/17
0
0
C++11 & C++14 & C++17新特性

原文:https://www.cnblogs.com/guxuanqing/p/6707824.html C++11:C++11包括大量的新特性:包括lambda表达式,类型推导关键字auto、decltype,和模板的大量改进。 新的关键字 auto C++11中引...

炎林2018
2018/12/06
0
0
【C++11】30分钟了解C++11新特性

---------- 点击进入我的新博客 什么是C++11 C++11是曾经被叫做C++0x,是对目前C++语言的扩展和修正,C++11不仅包含核心语言的新机能,而且扩展了C++的标准程序库(STL),并入了大部分的C++...

王选易
2013/12/10
0
42
三驾马车并驾齐驱 C++能否重焕青春

【IT168 技术】Java十几年来的迅猛发展,似乎在印证一个亘古不变的真理——与时俱进。C语言几年来也在不断发力,作为变种,Object C在Apple应用领域如火如荼,而作为编程语言前三甲的C++,似...

it168网站
2011/12/02
0
0
Qt5 中对 C++11 一些新特性的封装

C++11 是现在的 C++ 标准的名称,C++11 为 C++ 语言带来很多新特性。 而 Qt 4.8 是 Qt 首个在其 API 中开始使用一些新的 C++11 特性的版本,我之前写过一篇博文:C++11 in Qt 4.8 描述了这个...

红薯
2012/06/12
16K
8

没有更多内容

加载失败,请刷新页面

加载更多

用Python从0开始实现一个中文拼音输入法

众所周知,中文输入法是一个历史悠久的问题,但也实在是个繁琐的活,不知道这是不是网上很少有人分享中文拼音输入法的原因,接着这次NLP Project的机会,我觉得实现一发中文拼音输入法,看看...

计算机编程
21分钟前
3
0
阿里P7架构师对Java虚拟机、类加载机制是怎么理解的?

概述 类从被加载到虚拟机内存中开始,到卸载出内存为止,它的整个生命周期包括:加载 (Loading)、验证(Verification)、准备(Preparation)、解析(Resolution)、初始化 (Initializat...

kx33389
39分钟前
0
0
日本软银孙正义表示从未命令ARM断供华为

华为虽然有自主研发的麒麟处理器,但在架构和指令集方面仍然基于 ARM,所以当 ARM 切断与华为一切联系的消息传来后,很多人对华为麒麟的未来忧心忡忡,也怀疑已经收购了 ARM 的日本软银在背后...

linuxCool
47分钟前
4
0
mongodb安装、连接,mongodb用户管理、创建集合、数据管理、备份恢复,副本集介绍、搭建、测试,分片介绍、搭建、测试,php的mongodb扩展、mongo扩展

21.26 mongodb介绍 21.27 mongodb安装 21.28 连接mongodb 21.29 mongodb用户管理 21.30 mongodb创建集合、数据管理 21.31 php的mongodb扩展 21.32 php的mongo扩展 21.33 mongodb副本集介绍 ...

tobej
今天
3
0
C++的变量初始化

C++中变量的初始化有很多种方式,如:默认初始化,值初始化,直接初始化,拷贝初始化,列表初始化。 1、默认初始化:默认初始化是指定义变量时没有指定初值时进行的初始化操作。 如:int a;...

天王盖地虎626
今天
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部