加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

C++ lambda 表达式/函数

发布时间:2020-12-16 09:15:27 所属栏目:百科 来源:网络整理
导读:C++ lambda 表达式/函数 一. 简介 lambda 可以方便地定义和创建匿名函数。 ? 二. 语法 [capture list] (params list) mutable exception- return type { function body } 各项具体含义如下 capture list:捕获外部变量列表 params 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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读