商城首页欢迎来到中国正版软件门户

您的位置:首页 >C++ Lambda表达式使用教程

C++ Lambda表达式使用教程

  发布于2025-10-20 阅读(0)

扫一扫,手机访问

Lambda表达式是C++11引入的匿名函数特性,简化函数对象使用,基本语法为[捕获列表](参数列表) -> 返回类型 { 函数体 },常用于STL算法和回调场景。

C++如何使用Lambda表达式_C++ Lambda表达式使用方法

Lambda表达式是C++11引入的重要特性,它允许你在代码中定义匿名函数,简化函数对象的使用,特别适合用在算法和回调场景中。Lambda让代码更简洁、直观,尤其在配合STL算法时非常高效。

基本语法结构

一个Lambda表达式的完整形式如下:

[捕获列表] (参数列表) -> 返回类型 { 函数体 }

其中:

  • 捕获列表:决定如何访问外部变量(如局部变量)
  • 参数列表:和普通函数参数类似,可为空
  • 返回类型:可省略,编译器通常能自动推导
  • 函数体:执行的具体逻辑

最简单的例子:

auto greet = []() {
    std::cout << "Hello, Lambda!" << std::endl;
};
greet(); // 输出: Hello, Lambda!

捕获外部变量

Lambda可以捕获所在作用域的变量,方式有值捕获和引用捕获:

  • [=]:按值捕获所有外部变量
  • [&]:按引用捕获所有外部变量
  • [x]:只按值捕获变量x
  • [&x]:只按引用捕获变量x
  • [this]:捕获当前对象的this指针(在类成员函数中常用)

示例:

int a = 10;
int b = 20;

auto sum = [a, &b]() { return a + b; // a是值捕获,b是引用捕获 };

b = 30; std::cout << sum() << std::endl; // 输出40

在STL算法中的应用

Lambda常用于STL算法中替代函数指针或函数对象,提升可读性。

比如对vector排序:

#include <algorithm>
#include <vector>
#include <iostream>

std::vector<int> nums = {5, 2, 8, 1, 9};

std::sort(nums.begin(), nums.end(), [](int x, int y) { return x > y; // 降序排列 });

for (int n : nums) { std::cout << n << " "; // 输出: 9 8 5 2 1 }

再比如用for_each遍历并处理元素:


std::for_each(nums.begin(), nums.end(), [](int n) {
    std::cout << n * 2 << " ";
});

可变Lambda与存储Lambda

如果想在值捕获的Lambda中修改变量,需加上mutable关键字:

int counter = 0;
auto inc = [counter]() mutable {
    counter++;
    std::cout << "Counter: " << counter << std::endl;
};

inc(); // Counter: 1 inc(); // Counter: 2

若要保存Lambda供后续调用,可用std::function或auto:

#include <functional>

std::function<void(int)> printer = [](int x) { std::cout << "Value: " << x << std::endl; };

printer(42); // Value: 42

基本上就这些。Lambda表达式在现代C++中非常实用,掌握它的语法和捕获机制,能让代码更清晰、灵活。不复杂但容易忽略细节,多写几次就熟练了。

本文转载于:互联网 如有侵犯,请联系zhengruancom@outlook.com删除。
免责声明:正软商城发布此文仅为传递信息,不代表正软商城认同其观点或证实其描述。
  • Composer设置子装配体枢轴 Composer组件运动逻辑【手册】 正版软件
    Composer设置子装配体枢轴 Composer组件运动逻辑【手册】
    子装配体枢轴设置:从“灰色不可用”到精准控制的完整指南 在Composer中处理子装配体动画时,枢轴(Pivot)设置往往是第一个“拦路虎”。你可能会发现,明明选中了部件,那个关键的“启用枢轴”按钮却固执地显示为灰色。这并非软件故障,而是Composer底层逻辑在提醒你:子装配体的变换自由度,首先取
    1小时前 13:31 0
  • VSCode怎么配置Move语言智能合约开发环境 正版软件
    VSCode怎么配置Move语言智能合约开发环境
    VSCode怎么配置Move语言智能合约开发环境 VSCode不直接支持Move语言开发,需手动配置Sui CLI及move-analyzer语言服务器;必须确保move-analyzer在PATH中、正确设置settings.json指向其路径,并以含Move.toml的目录为工作区根目录。 想在
    1小时前 13:30 0
  • 如何解决处理日期和时间的问题?使用Composer集成Carbon吧! 正版软件
    如何解决处理日期和时间的问题?使用Composer集成Carbon吧!
    Carbon本身不解决日期时间问题,只是简化PHP原生DateTime;常见问题源于时区(如默认UTC导致差8小时)、模糊格式解析(如‘01/02/2024’解读歧义)、JSON序列化时区/毫秒处理不当及链式调用误用。 先明确一个核心认知:Carbon 并非日期时间问题的“终极解决方案”,它本质上是
    1小时前 13:30 0
  • 怎样在Python Flask中实现简单的搜索功能_利用SQL-LIKE模糊查询 正版软件
    怎样在Python Flask中实现简单的搜索功能_利用SQL-LIKE模糊查询
    怎样在Python Flask中实现简单的搜索功能:利用SQL-LIKE模糊查询 在Web应用中,搜索功能几乎是标配。但一个看似简单的搜索框背后,从接收关键词到数据库查询,每一步都有讲究。今天,我们就来拆解一下,如何在Flask框架中安全、高效地实现基于SQL LIKE的模糊搜索。 Flask路由里
    2小时前 12:58 0
  • C++ std::source_location自动化记录异常抛出位置 _ 调试技巧【详解】 正版软件
    C++ std::source_location自动化记录异常抛出位置 _ 调试技巧【详解】
    C++异常调试:如何让std::source_location真正帮你定位问题 先说一个关键结论:std::source_location不会自动记录异常抛出位置,必须显式传入。它本质上与异常机制解耦,不参与栈展开过程。 为什么std::source_location不会自动出现在throw中 很多
    2小时前 12:58 0

热门关注