C++中lambda表达式常见使用方式

基本语法:

[捕获列表](参数列表) mutable(可选) 异常属性 -> 返回类型 {
 // 函数体
 }
 
 //示例
 int main() { 
 auto Add = [](int a, int b)->int { 
     return a + b; 
 }; 
     //输出3
     std::cout << Add(1, 2) << std::endl;      
     return 0; 
}
捕获列表:
  • 值捕获:与参数传值类似,值捕获的前提是变量可以拷贝,不同之处则在于,被捕获的变量在 lambda表达式被创建时拷贝,而非调用时才拷贝
    void test3(){
     
        cout << "test3" << endl;
        int c = 12;
        int d = 30;
        auto Add = [c, d](int a, int b)->int {
            //这块d会输出的是30
            cout << "d = " << d  << endl;
            return c;
        };
        d = 20;
        std::cout << Add(1, 2) << std::endl;
    }
    
    • 引用捕获:与引用传参类似,引用捕获保存的是引用,值会发生变化
      void test3(){
       
          cout << "test3" << endl;
          int c = 12;
          int d = 30;
          auto Add = [&c, &d](int a, int b)->int {
              c = a;
              //输出的d是20
              cout << "d = " << d  << endl;
              return c;
          };
          d = 20;
          std::cout << Add(1, 2) << std::endl;
      }
      
      • 隐式捕获:手动书写捕获列表有时候是非常复杂的,这种机械性的工作可以交给编译器来处理,这时候可以在捕获列表中写一个 & 或 = 向编译器声明采用引用捕获或者值捕获。
        void test7(){
         
            cout << "test7" << endl;
            int c = 12;
             int d = 30;
            // 把捕获列表的&改成=再测试
            auto Add = [&](int a, int b)->int {
            c = a; // 编译对的
                cout << "d = " << d  << endl;
                return c;
            };
            d = 20;
            std::cout << Add(1, 2) << std::endl;
            std::cout << "c:" << c<< std::endl;
        }
        • 空捕获列表:捕获列表'[]'中为空,表示Lambda不能使用所在函数中的变量。
          void test8(){
          
              cout << "test7" << endl;
              int c = 12;
              int d = 30;
              // 把捕获列表的&改成=再测试
              // [] 空值,不能使用外面的变量
              // [=] 传值,lambda外部的变量都能使用
              // [&] 传引用值,lambda外部的变量都能使用
              auto Add = [&](int a, int b)->int {
                  cout << "d = " << d  << endl; // 编译报错
                  return c;// 编译报错
              };
              d = 20;
              std::cout << Add(1, 2) << std::endl;
              std::cout << "c:" << c<< std::endl;
          }
          
          • 可变lambda:
            • 采用值捕获的方式,lambda不能修改其值,如果想要修改,使用mutable修饰
            • 采用引用捕获的方式,lambda可以直接修改其值
            • void test12() {
                  cout << "test12" << endl;
                  int v = 5;
                  // 值捕获方式,使用mutable修饰,可以改变捕获的变量值
                  auto ff = [v]() mutable {return ++v;};
                   v = 0;
                  auto j = ff();  // j为6
               }
               void test13() {
                  cout << "test13" << endl;
                  int v = 5;
                  // 采用引用捕获方式,可以直接修改变量值
                  auto ff = [&v] {return ++v;};
                  v = 0;
                  auto j = ff(); 
               } // v引用已修改,j为1

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值