当前位置 : 主页 > 编程语言 > c++ >

C++ lambda 表达式/函数

来源:互联网 收集:自由互联 发布时间:2021-06-23
C++ lambda 表达式/函数 一. 简介 lambda 可以方便地定义和创建匿名函数。 二. 语法 [capture list] (params list) mutable exception- return type { function body } 各项具体含义如下 capture list:捕获外部变量列

C++ lambda 表达式/函数

一. 简介

lambda 可以方便地定义和创建匿名函数。

 

二. 语法

[capture list] (params list) mutable exception-> return type { function body }

  

各项具体含义如下

  1. capture list:捕获外部变量列表
  2. params list:形参列表      (可省略)
  3. mutable指示符:用来说用是否可以修改捕获的变量  (可省略)
  4. exception:异常设定  (可省略)
  5. return type:返回类型       (可省略,如省略则自动从函数体中判断返回类型,return后的值。如果没有则返回void)
  6. function body:函数体

 

1. 捕获外部变量

  通过在最前面的方括号中输入一些特殊符号,明确指出哪些外部变量可以被lambda函数捕获。

  (1) 值捕获[变量名]

  函数体内不能改变捕获变量的值,否则会引起编译错误。相当于函数参数中的值传递,会对值进行一个拷贝。

int main()
{
    int a = 123;
    auto f = [a] { cout << a << endl; }; 
    a = 321;
    f(); // 输出:123
}

  

  (2) 引用捕获[&变量名]

  相当于函数参数中的引用传递,不会做拷贝,其值会随外部的变量改变而改变。在函数体内可以对变量进行修改。

int main()
{
    int a = 123;
    auto f = [&a] { 
    a += 1;
    cout << a << endl; }; a += 1; f(); // 输出:125 }

  

  (3) 隐式捕获 [=] [&]

   [] 中不写明变量名,具体捕获哪个变量有函数体内的语句自动判断。也有两种捕获方式:

  [=]:值捕获所有外部变量,同(1)值捕获

  [&]: 引用捕获所有外部变量,同(2)引用捕获

 

  (4) 混合方式,以逗号分离不同的方式

  • [] : 不捕获任何变量
  • [变量名,变量名]: 指定捕获多个变量
  • [this]: 以值的形式捕获this指针
  • [=,&x]: 以值捕获的方式捕获所有变量,对x进行引用捕获
  • [&,=x]: 以引用方式捕获所有变量,对x进行值捕获

  (5) 关键字,修改值捕获变量,mutable

  如果加mutable关键字,则表明参数的括号()不能省

int main()
{
    int a = 123;
    auto f = [a]()mutable { cout << ++a; }; // 不会报错
    cout << a << endl; // 输出:123
    f(); // 输出:124
}

 

 

2. 形参列表

  • 不能有默认参数,因为没有意义
  • 所有参数必须有参数名,因为一定会使用,不然没意义
  • 不支持可变参数 

 

二. 示例

1. 作为stl算法的输入:

vector<int> myvec{ 3, 2, 5, 7, 3, 2 };

sort(myvec.begin(), myvec.end(), [](int a, int b) -> bool { return a < b; });   // Lambda表达式

16:25:40

网友评论