Chinaunix首页 | 论坛 | 博客
  • 博客访问: 336995
  • 博文数量: 100
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 521
  • 用 户 组: 普通用户
  • 注册时间: 2014-10-31 11:37
个人简介

活到老,学到老

文章分类

全部博文(100)

文章存档

2018年(1)

2017年(2)

2016年(11)

2015年(82)

2014年(4)

我的朋友

分类: C/C++

2016-08-20 12:24:06

lambda表达式的语法定义如下

  [capture] (parameters) mutable ->return-type {statement};

参数解释:    
[capture]:
捕捉列表。
               捕捉列表总是出现在lambda函数的开始处。实质上,[]是lambda引出符(即独特的标志符)

          编译器根据该引出符判断接下来的代码是否是lambda函数
          捕捉列表能够捕捉上下文中的变量以供lambda函数使用
          捕捉列表由一个或多个捕捉项组成,并以逗号分隔,捕捉列表一般有以下几种形式:   

    • [var] 表示值传递方式捕捉变量var
    • [=] 表示值传递方式捕捉所有父作用域的变量(包括this指针)
    • [&var] 表示引用传递捕捉变量var
    • [&] 表示引用传递捕捉所有父作用域的变量(包括this指针)
    • [this] 表示值传递方式捕捉当前的this指针
    • [=,&a,&b] 表示以引用传递的方式捕捉变量 a 和 b,而以值传递方式捕捉其他所有的变量
    • [&,a,this] 表示以值传递的方式捕捉 a 和 this,而以引用传递方式捕捉其他所有变量
            注意捕捉列表不允许变量重复传递   

(parameters):参数列表。
       与普通函数的参数列表一致。如果不需要参数传递,则可以连同括号()一起省略


mutable : mutable修饰符。
       默认情况下,lambda函数总是一个const函数,mutable可以取消其常量性(下面代码中有讲解)

     注意在使用该修饰符时,参数列表不可省略(即使参数为空)

->return-type : 返回类型。        
        用追踪返回类型形式声明函数的返回类型。
不需要返回值的时候也可以连同符号->一起省略

{statement} : 函数体。
        内容与普通函数一样,不过除了可以使用参数之外,还可以使用所有捕获的变量


代码示例

  1. #include
    #include
    #include


    using namespace std;

    int main(int argc, char *argv[])
    {
        int a = 3;
        int b = 2;

        auto f1 = [](int a, int b)->int{return a + b; };
        int add = f1(a, b);
        cout << "add :"<     //捕获父作用a、b变量的值
        auto f2 = [=]{return a - b; };
        int subtract = f2();
        cout << "subtract: " << subtract << endl;

        //父作用域中a传入lambda中具有了const属性,不能修改它的值,mutabl取消了a的const特性
        auto f3 = [=]()mutable{a = 4; return a * b; };
        int multiply = f3();
        cout << "multiply" << multiply << endl;

        //lambda与stl
        vector vec;
        for (int i = 1; i <=10; i++)
        {
            vec.push_back(i);
        }

  2.     for_each(vec.begin(), vec.end(), [](int ver){cout << ver;});
        cout << endl;

  3.     //虽然上面的形式已经简洁了很多,不过我还是觉得下面的更简洁
        for (auto i : vec) {cout << i << endl;}
    1.    cout << endl;
        system("pause");
        return 0;
    }





阅读(913) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~