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算法一起使用的:

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

你可能感兴趣的:(C++11 lambda 表达式)