在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算法一块儿使用的: google
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标志”[ ]”里面的“&”改为“=”,看看输出的结果是否同样。 spa
再来看看lambda的嵌套,相似于for循环的嵌套哦: code
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表达式其实就是个语法糖,它并无增长编程语言的功能,只是增长代码的可读性(貌似对于没有接触过这种语法的人,应该是减小了代码的可读性),以上纯属我的能心得,若有错误,欢迎指正。 接口