C++11 lambda 表达式

                                    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算法一块儿使用的: 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表达式其实就是个语法糖,它并无增长编程语言的功能,只是增长代码的可读性(貌似对于没有接触过这种语法的人,应该是减小了代码的可读性),以上纯属我的能心得,若有错误,欢迎指正。 接口

相关文章
相关标签/搜索