C语言中如何使用lambda表达式定义匿名函数?

2026-04-16 21:353阅读0评论SEO教程
  • 内容介绍
  • 文章标签
  • 相关推荐

本文共计1113个文字,预计阅读时间需要5分钟。

C语言中如何使用lambda表达式定义匿名函数?

lambda 表达式简介Lambda 表达式可以方便地定义和创建匿名函数。它允许你以更简洁的方式编写代码,特别是当你需要一个临时函数时。

一、简介Lambda 表达式可以用来定义和创建匿名函数。它特别适用于那些只需要一次执行的简单函数。

二、语法语法格式:[capture list] (params list) -> mutable exception -> return type { function body }各项具体含义如下:- capture list:捕获外部变量列表,用于在 lambda 函数内部访问外部变量。- params list:参数列表,定义函数的参数。- mutable exception:可选的异常处理,用于捕获和处理函数内部抛出的异常。- return type:返回类型,指定函数返回值的类型。- function body:函数体,包含函数的具体实现。

三、示例假设我们需要一个简单的函数,用于计算两个数的和:

pythonsum=lambda x, y: x + yprint(sum(3, 4)) # 输出:7

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) 隐式捕获 [=] [&]

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

C语言中如何使用lambda表达式定义匿名函数?

  [=]:值捕获所有外部变量,同(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

本文共计1113个文字,预计阅读时间需要5分钟。

C语言中如何使用lambda表达式定义匿名函数?

lambda 表达式简介Lambda 表达式可以方便地定义和创建匿名函数。它允许你以更简洁的方式编写代码,特别是当你需要一个临时函数时。

一、简介Lambda 表达式可以用来定义和创建匿名函数。它特别适用于那些只需要一次执行的简单函数。

二、语法语法格式:[capture list] (params list) -> mutable exception -> return type { function body }各项具体含义如下:- capture list:捕获外部变量列表,用于在 lambda 函数内部访问外部变量。- params list:参数列表,定义函数的参数。- mutable exception:可选的异常处理,用于捕获和处理函数内部抛出的异常。- return type:返回类型,指定函数返回值的类型。- function body:函数体,包含函数的具体实现。

三、示例假设我们需要一个简单的函数,用于计算两个数的和:

pythonsum=lambda x, y: x + yprint(sum(3, 4)) # 输出:7

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) 隐式捕获 [=] [&]

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

C语言中如何使用lambda表达式定义匿名函数?

  [=]:值捕获所有外部变量,同(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