lambda函数(匿名函数)的使用

Lambda(也称为 lambda 表达式或匿名函数)是 C++11 及其后续版本引入的一种特性,它允许你定义一个匿名的、内联的函数对象(也称为闭包)。Lambda 表达式提供了一种紧凑的方式来表示可以像函数一样调用的代码块,并且这些代码块可以捕获其所在作用域中的变量。

Lambda 表达式的基本语法如下:


  
[capture](parameters) -> return-type { body }
  • capture:捕获子句,用于指定 lambda 表达式体中可以访问的外部变量。捕获方式可以是值捕获(=)或引用捕获(&),或者明确指定要捕获的变量(如 [x, &y])。如果省略捕获子句,则默认不会捕获任何外部变量。
  • parameters:参数列表,与普通函数的参数列表类似。
  • return-type:返回类型,如果 lambda 表达式的返回类型可以从函数体推断出来,则可以省略。
  • body:lambda 表达式的主体,即要执行的代码块。

在 Linux 环境下使用 C++ 的 lambda 表达式是很常见的,因为 lambda 表达式提供了一种简洁的方式来定义匿名函数对象。下面是一个在 Linux 上使用 C++ 编写,包含 lambda 表达式的简单示例:

首先,你需要一个 C++ 编译器,如 g++,这是 Linux 系统上常用的 C++ 编译器。

下面是一个简单的示例程序,它使用 std::for_each 算法和 lambda 表达式来遍历一个整数数组并打印每个元素:

#include <iostream>  
#include <vector>  
#include <algorithm>  
  
int main() {  
    // 创建一个整数向量  
    std::vector<int> numbers = {1, 2, 3, 4, 5};  
  
    // 使用 std::for_each 和 lambda 表达式遍历并打印每个元素  
    std::for_each(numbers.begin(), numbers.end(), [](int num) {  
        std::cout << num << std::endl;  
    });  
  
    return 0;  
}

你可以按照以下步骤来编译和运行这个程序:

  1. 将上面的代码保存到一个文件中,比如 lambda_example.cpp
  2. 打开终端,导航到保存 lambda_example.cpp 的目录。
  3. 使用 g++ 编译器编译文件:g++ -o lambda_example lambda_example.cpp
  4. 运行编译后的程序:./lambda_example

输出将会是:

1 2 3 4 5

在这个例子中,我们创建了一个包含整数的 std::vector。然后,我们使用 std::for_each 算法来遍历这个向量的每个元素。std::for_each 的第三个参数是一个函数对象,这里我们使用了一个 lambda 表达式来定义这个函数对象。这个 lambda 表达式接受一个整数作为参数,并打印这个整数。当 std::for_each 遍历向量的每个元素时,它都会调用这个 lambda 表达式,并传入当前的元素作为参数。

在这段代码中,std::for_each 是 C++ 标准库 <algorithm> 中的一个算法,它用于遍历一个范围(比如一个容器的所有元素)并对每个元素执行一个指定的操作。这个操作通常由一个函数对象(比如函数指针、函数对象或 lambda 表达式)来提供。

具体来说,std::for_each 的三个参数是:

  1. numbers.begin():表示要遍历的范围的起始迭代器。在这个例子中,它是 numbers 向量的开始迭代器。
  2. numbers.end():表示要遍历的范围的结束迭代器(注意,这个迭代器并不指向范围中的最后一个元素,而是指向范围之后的第一个位置)。在这个例子中,它是 numbers 向量的结束迭代器。
  3. 第三个参数是一个函数对象,它定义了要对范围中的每个元素执行的操作。在这个例子中,它是一个 lambda 表达式。

Lambda 表达式 [](int num) { std::cout << num << std::endl; } 的定义如下:

  • []:这是 lambda 表达式的捕获子句。在这个例子中,它是空的,意味着 lambda 表达式不捕获任何外部变量。
  • (int num):这是 lambda 表达式的参数列表。它声明了一个名为 num 的整数参数,该参数在 lambda 表达式的函数体中可以访问。
  • { std::cout << num << std::endl; }:这是 lambda 表达式的函数体。当 lambda 表达式被调用并传入一个整数参数时,它会执行这个函数体中的代码。在这个例子中,它使用 std::cout 打印出传入的整数 num,并在其后添加一个换行符。

因此,当 std::for_each(numbers.begin(), numbers.end(), /*lambda expression*/) 被调用时,它会遍历 numbers 向量中的每个元素,并对每个元素执行 lambda 表达式定义的操作(即打印出元素的值)。最终,你会在终端上看到 numbers 向量中的所有元素被依次打印出来。

相关推荐

  1. lambda函数匿名函数使用

    2024-05-16 09:46:05       13 阅读
  2. Python——lambda匿名函数

    2024-05-16 09:46:05       40 阅读
  3. 匿名函数lambda

    2024-05-16 09:46:05       14 阅读
  4. 【Python基础】Lambda匿名函数

    2024-05-16 09:46:05       15 阅读
  5. C++之lambda匿名函数

    2024-05-16 09:46:05       12 阅读
  6. 深入探讨Python中匿名函数lambda

    2024-05-16 09:46:05       18 阅读
  7. 【C++】C++ 中 lambda 表达式(匿名函数

    2024-05-16 09:46:05       10 阅读
  8. 匿名函数lambda匿名函数 ( Everything is up to us!)

    2024-05-16 09:46:05       6 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-05-16 09:46:05       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-05-16 09:46:05       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-05-16 09:46:05       18 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-05-16 09:46:05       20 阅读

热门阅读

  1. 在本地设备上配置 Git 忽略特定文件

    2024-05-16 09:46:05       13 阅读
  2. 解释 Git 的基本概念和使用方式。

    2024-05-16 09:46:05       13 阅读
  3. 51 单片机[2-3]:LED流水灯

    2024-05-16 09:46:05       13 阅读
  4. Visual studio的使用

    2024-05-16 09:46:05       9 阅读
  5. 什么是单线服务器?

    2024-05-16 09:46:05       13 阅读
  6. 2.深度学习介绍

    2024-05-16 09:46:05       9 阅读
  7. 【董晓算法】竞赛常用知识点之数据结构1

    2024-05-16 09:46:05       12 阅读
  8. UBUNTU下指定执行文件运行时查找库的路径

    2024-05-16 09:46:05       11 阅读
  9. Coins与Tokens的理解与区别

    2024-05-16 09:46:05       11 阅读
  10. LeetCode hot100-38-Y

    2024-05-16 09:46:05       12 阅读
  11. IT行业的现状与未来:重塑世界的科技力量

    2024-05-16 09:46:05       15 阅读