C++中的lambda表达式详解

Lambda表达式是一种可以在代码中定义匿名函数的方式,通常用于简化代码,使其更紧凑和易读。它的语法如下:

cpp 复制代码
[capture](parameters) -> return_type { body }

下面逐个解释每个部分:

1. 捕获列表 (capture)

捕获列表用于指定哪些外部变量可以在lambda表达式中使用。捕获列表可以有以下几种方式:

  • [ ]:不捕获任何变量。
  • [=]:按值捕获外部作用域中所有变量。
  • [&]:按引用捕获外部作用域中所有变量。
  • [this]:按引用捕获当前类的 this 指针(用于成员函数中)。
  • [变量名]:按值捕获指定的变量。
  • [&变量名]:按引用捕获指定的变量。

2. 参数列表 (parameters)

参数列表与普通函数的参数列表类似,指定lambda表达式可以接受的参数。

3. 返回类型 (return_type)

返回类型是可选的,如果省略,编译器会自动推断返回类型。如果需要显式指定返回类型,可以使用 -> 符号。

4. 函数体 (body)

函数体是lambda表达式的主要部分,包含要执行的代码。

例子

让我们通过几个例子来理解lambda表达式的使用:

示例1:简单的lambda表达式
cpp 复制代码
auto add = [](int a, int b) -> int {
    return a + b;
};

int result = add(3, 4); // result 为 7

这个lambda表达式定义了一个匿名函数,它接受两个整数参数 ab,返回它们的和。这个匿名函数被赋值给变量 add,然后可以像普通函数一样调用。

示例2:捕获外部变量
cpp 复制代码
int x = 10;
int y = 20;

auto sum = [x, &y](int z) {
    return x + y + z;
};

int result = sum(5); // result 为 35,因为 10 + 20 + 5 = 35

在这个例子中,lambda表达式捕获了外部变量 xyx 是按值捕获的,y 是按引用捕获的,所以 y 在lambda表达式中可以修改。

示例3:在标准库算法中使用lambda表达式
cpp 复制代码
#include <iostream>
#include <vector>
#include <algorithm>

int main() {
    std::vector<int> nums = {1, 2, 3, 4, 5};
    int sum = 0;

    std::for_each(nums.begin(), nums.end(), [&sum](int num) {
        sum += num;
    });

    std::cout << "Sum: " << sum << std::endl; // 输出 Sum: 15
    return 0;
}

在这个例子中,lambda表达式被传递给 std::for_each 算法,用于遍历向量 nums 中的每个元素,并将每个元素的值累加到外部变量 sum 中。

总结

Lambda表达式在C++中是一种强大的工具,可以让代码更加简洁和灵活。它们尤其适用于需要定义短小的匿名函数的场景,比如在标准库算法中传递自定义操作。在学习和使用lambda表达式时,理解捕获列表和参数列表的使用是关键。

相关推荐
不想写代码的星星6 小时前
C++继承、组合、聚合:选错了是屎山,选对了是神器
c++
不想写代码的星星1 天前
std::function 详解:用法、原理与现代 C++ 最佳实践
c++
樱木Plus3 天前
深拷贝(Deep Copy)和浅拷贝(Shallow Copy)
c++
blasit5 天前
笔记:Qt C++建立子线程做一个socket TCP常连接通信
c++·qt·tcp/ip
肆忆_6 天前
# 用 5 个问题学懂 C++ 虚函数(入门级)
c++
不想写代码的星星6 天前
虚函数表:C++ 多态背后的那个男人
c++
端平入洛8 天前
delete又未完全delete
c++
端平入洛9 天前
auto有时不auto
c++
郑州光合科技余经理10 天前
代码展示:PHP搭建海外版外卖系统源码解析
java·开发语言·前端·后端·系统架构·uni-app·php
feifeigo12310 天前
matlab画图工具
开发语言·matlab