c++ lambda的使用和介绍

本文深入解析C++中Lambda表达式的具体形式与应用,包括捕获列表、参数列表、异常设定等关键概念,通过实例演示了如何使用Lambda表达式进行变量捕获及函数体的定义。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Lambda 表达式具体形式如下:
[capture list] (params list) mutable exception-> return type { function body }

各项具体含义如下

capture list:捕获外部变量列表
params list:形参列表
mutable指示符:用来说用是否可以修改捕获的变量
exception:异常设定
return type:返回类型
function body:函数体

[] // 沒有定义任何变量。使用未定义变量会引发错误。
[x, &y] // x以传值方式传入(默认),y以引用方式传入。
[&] // 任何被使用到的外部变量都隐式地以引用方式加以引用。
[=] // 任何被使用到的外部变量都隐式地以传值方式加以引用。
[&, x] // x显式地以传值方式加以引用。其余变量以引用方式加以引用。
[=, &z] // z显式地以引用方式加以引用。其余变量以传值方式加以引用。

int main()
{
    int x, y, z;
    x = 10;
    y = 20;
    z = [&x,y](int &a, int b) -> int {
        int demo;
        a++;
        b--;
        demo = a * b;
        return demo;
    }(x, y);
    cout << z << endl;
    cout << x << endl;
    cout << y << endl;
    return 0;
}
打印结果:
209
11
20

代码剖析:

[&x,y] : &x, 表示把x的地址传进去, 在里面修改x值,外面的x的值跟着改变 ,y表示把值传进去, 修改y不改变外部y的值
(int &a,int b) 传地址 需要使用&符号
(x,y) 闭包执行方法,传入的参数

<think>嗯,用户让我介绍一下C++中的Lambda表达式,并举一些例子。好,我得先回忆一下Lambda的基本概念用法。LambdaC++11引入的特性,对吧?它主要用于创建匿名函数对象,方便在需要函数对象的地方快速定义,比如在算法中作为谓词或者回调函数。 首先,我应该解释Lambda的结构。Lambda的基本语法是:[捕获列表](参数列表) -> 返回类型 {函数体}。不过返回类型通常可以省略,让编译器自动推导。捕获列表这部分可能对于初学者来说有点难,需要详细说明不同的捕获方式,比如值捕获、引用捕获,还有隐式捕获。 接下来,用户需要例子,我得想几个典型的应用场景。比如在STL算法中的使用,像sort、for_each这些。可能第一个例子可以用sort函数,用Lambda作为比较函数,这样能展示Lambda的简洁性。例如,对vector进行排序,降序排列的话,可以写一个Lambda比较两个元素,返回a > b。 第二个例子可以考虑用for_each遍历容器并修改元素,这时候可能需要使用引用捕获,比如给每个元素加一个值。这时候要说明捕获列表中使用&来捕获外部变量,或者显式捕获某个变量。 第三个例子可能涉及异步编程,比如在线程中使用Lambda,这时候需要捕获局部变量,但要注意生命周期的问题。或者使用mutable关键字来允许修改值捕获的变量,虽然这在实际中可能不太常见,但可以说明Lambda的灵活性。 另外,可能用户对捕获列表不太清楚,需要举不同的捕获方式的例子,比如[=]表示以值捕获所有外部变量,[&]是引用捕获,或者混合捕获,比如[=, &x]表示x用引用,其他用值。 还有,返回类型的例子,当函数体有多个return语句且返回类型不同时,可能需要显式指定返回类型。比如一个Lambda,根据条件返回int或double,这时候需要明确指定返回类型,避免编译器错误。 还要注意,Lambda的类型是唯一的,无法用标准类型表示,通常用auto来存储,或者用std::function来包装。这点可能需要提到,尤其是在需要传递Lambda作为函数参数时,使用模板或std::function的情况。 可能用户会混淆值捕获引用捕获的区别,尤其是修改捕获变量时的效果。比如值捕获在Lambda内部修改不会影响外部变量,而引用捕获则会。这时候可以用例子说明,比如在Lambda内部改变捕获的变量,外部是否同步变化。 另外,LambdaC++14之后有一些新特性,比如泛型Lambda,参数可以用auto,但用户可能问的是基础,所以暂时不需要涉及,除非用户明确提到。 需要检查例子是否正确,比如在for_each中使用引用捕获修改元素,是否正确。例如,使用for_eachLambda给每个元素加1,需要确保容器中的元素是可修改的,比如vector<int>,并且使用引用捕获或者通过引用传递参数。 可能还要提到Lambda在事件处理、回调函数中的应用,比如作为STL算法的谓词,或者在Qt中的信号槽连接中使用Lambda,但例子可能比较复杂,先举简单的例子。 总结一下,结构应该是先介绍Lambda的语法,然后分点举例不同情况下的使用,每个例子说明一个特定的点,比如捕获列表、参数、返回类型、在STL中的应用等。确保例子简洁易懂,代码正确,并给出注释解释关键部分。</think>C++ Lambda 表达式(C++11 起)是创建匿名函数对象的便捷方式,以下是关键使用场景示例: --- ### 基础语法结构 ```cpp [捕获列表](参数列表) -> 返回类型 { 函数体 } ``` --- ### 场景一:STL算法参数 ```cpp #include <vector> #include <algorithm> // 示例1:排序自定义规则 std::vector<int> nums = {3,1,4,1,5}; std::sort(nums.begin(), nums.end(), [](int a, int b) { return a > b; }); // 降序排列 // 示例2:条件过滤 auto it = std::remove_if(nums.begin(), nums.end(), [](int x) { return x % 2 == 0; }); // 移除偶数 ``` --- ### 场景二:捕获外部变量 ```cpp // 示例3:值捕获 int base = 10; auto addBase = [base](int x) { return x + base; }; std::cout << addBase(5); // 输出15 // 示例4:引用捕获 std::string greeting = "Hello"; auto append = [&greeting](const std::string& s) { greeting += " " + s; // 修改外部变量 }; append("World"); // greeting变为"Hello World" ``` --- ### 场景三:可变Lambda(修改值捕获变量) ```cpp // 示例5:mutable关键字 int counter = 0; auto increment = [counter]() mutable { counter++; // 允许修改值捕获副本 return counter; }; increment(); // 返回1,外部counter仍为0 ``` --- ### 场景四:异步编程 ```cpp #include <thread> #include <iostream> // 示例6:线程任务 std::thread t([name = "Thread1"] { // C++14 初始化捕获 std::cout << name << " is running\n"; }); t.join(); ``` --- ### 完整实战示例 ```cpp #include <iostream> #include <vector> #include <algorithm> int main() { std::vector<double> temps {36.5, 38.2, 35.9, 37.8}; double threshold = 37.0; // 统计高于阈值温度的数量 int count = std::count_if(temps.begin(), temps.end(), [threshold](double t) { return t > threshold; }); // 生成温度转换器(摄氏度转华氏度) auto toFahrenheit = [](double celsius) -> double { return celsius * 9/5 + 32; }; std::cout << "高温天数: " << count << "\n" << "38.2°C = " << toFahrenheit(38.2) << "°F\n"; } ``` --- ### 关键特性总结 1. **捕获方式**: - `[=]` 值捕获所有外部变量 - `[&]` 引用捕获所有外部变量 - `[x, &y]` 混合捕获 2. **返回类型**:简单表达式可自动推导,复杂逻辑需显式声明 3. **应用场景**:算法参数、闭包封装、异步回调、延迟执行等 Lambda极大提升了C++在处理函数对象时的灵活性代码简洁性,特别适合需要临时定义简单逻辑的场景。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值