C++ lamada 表达式

在C++中,lambda表达式是一种定义匿名函数对象(也称为闭包)的简洁方式,它能够捕获(capture)其所在作用域内的变量,并在函数体内使用这些变量。Lambda表达式在C++11中首次引入,极大地增强了C++的函数式编程能力和表达能力。

Lambda表达式的基本语法

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

复制代码
[capture](parameters) -> return_type { body }
  • capture:捕获列表,指定哪些外部变量可以在lambda函数体内被访问。捕获方式可以是按值捕获(值传递)或按引用捕获(引用传递)。
  • parameters:参数列表,与普通函数的参数列表相同。
  • return_type:返回类型,可以省略,此时编译器会自动推导返回类型(C++14及更高版本支持)。
  • body:函数体,包含lambda表达式的具体实现。

示例

下面是一个简单的lambda表达式示例,它计算两个整数的和并返回结果:

复制代码
#include <iostream>
#include <functional>

int main() {
    // 定义一个lambda表达式
    auto sum = [](int a, int b) -> int { return a + b; };

    // 使用lambda表达式
    int result = sum(3, 4);
    std::cout << "The sum is: " << result << std::endl;

    return 0;
}

在这个例子中,sum是一个lambda表达式,它接受两个整数参数ab,并返回它们的和。我们使用auto关键字来自动推导lambda表达式的类型,并将其赋值给变量sum。然后,我们像调用普通函数一样调用sum

捕获列表

捕获列表是lambda表达式的一个关键特性,它允许我们在lambda函数体内访问外部变量。捕获列表的语法是[capture],其中capture可以是以下之一:

  • []:不捕获任何外部变量。
  • [x]:按值捕获外部变量x
  • [&x]:按引用捕获外部变量x
  • [=]:按值捕获所有外部变量(C++14及更高版本支持)。
  • [&]:按引用捕获所有外部变量。
  • [=, &x]:按值捕获所有外部变量,但x按引用捕获。
  • [&, x]:按引用捕获所有外部变量,但x按值捕获。

示例(带捕获列表)

下面是一个带捕获列表的lambda表达式示例:

复制代码
#include <iostream>

int main() {
    int x = 10;
    int y = 20;

    // 定义一个lambda表达式,捕获x和y
    auto increment_and_sum = ‌:ml-search[&x, y] -> int {
        x++;
        return x + y;
    };

    // 使用lambda表达式
    int result = increment_and_sum();
    std::cout << "The result is: " << result << std::endl; // 输出:The result is: 31
    std::cout << "x is now: " << x << std::endl;           // 输出:x is now: 11

    return 0;
}

在这个例子中,increment_and_sum是一个lambda表达式,它按引用捕获x并按值捕获y。在函数体内,我们递增了x的值,并返回了xy的和。注意,由于x是按引用捕获的,所以lambda表达式对x的修改会反映到原始变量上。

相关推荐
智者知已应修善业32 分钟前
【51单片机2个按键控制流水灯运行与暂停】2023-9-6
c++·经验分享·笔记·算法·51单片机
云泽8082 小时前
C++11 核心特性全解:列表初始化、右值引用与移动语义实战
开发语言·c++
AI进化营-智能译站3 小时前
ROS2 C++开发系列12-用多态与虚函数构建可扩展的ROS2机器人行为模块
开发语言·c++·ai·机器人
Morwit3 小时前
QML组件之间的通信方案(暴露子组件)
c++·qt·职场和发展
qeen873 小时前
【数据结构】建堆的时间复杂度讨论与TOP-K问题
c语言·数据结构·c++·学习·
图码3 小时前
如何用多种方法判断字符串是否为回文?
开发语言·数据结构·c++·算法·阿里云·线性回归·数字雕刻
handler013 小时前
Linux 内核剖析:进程优先级、上下文切换与 O(1) 调度算法
linux·运维·c语言·开发语言·c++·笔记·算法
zhouwy1133 小时前
Linux进程与线程编程详解
linux·c++
A7bert7775 小时前
【YOLOv8pose部署至RDK X5】模型训练→转换bin→Sunrise 5部署
c++·python·深度学习·yolo·目标检测
li1670902705 小时前
第二十七章:智能指针
c语言·数据结构·c++·visual studio