当前位置: 首页 > article >正文

C++ `Lambda` 函数完整指南

C++ Lambda 函数完整指南

Lambda 函数(匿名函数)是 C++11 引入的一个强大特性,它允许在 函数内部 定义简洁的 匿名函数对象,并且可以 捕获外部变量,用于 回调函数、并发编程、STL 算法 等场景。


1. Lambda 语法

[capture](parameters) -> return_type { body }
部分作用
[capture]捕获外部变量
(parameters)参数列表(可以为空)
-> return_type返回类型(可省略,自动推导)
{ body }函数体

2. 最简单的 Lambda

#include <iostream>

int main() {
    auto hello = []() { std::cout << "Hello, Lambda!\n"; };
    hello();  // ✅ 调用 Lambda
}

📌 Lambda 赋值给 auto,可以随时调用!

📌 省略 () 也可以

[] { std::cout << "Hello, Lambda!\n"; }();

✅ 直接调用 Lambda


3. 带参数的 Lambda

auto add = [](int a, int b) { return a + b; };
std::cout << add(3, 5);  // 输出:8

📌 参数列表 (int a, int b) 类似普通函数


4. Lambda 的捕获([capture]

(1)按值 [=] 捕获

int x = 10;
auto lambda = [=]() { std::cout << x; };
lambda();  // ✅ 复制 x(不会修改原值)

📌 外部 x 复制到 Lambda 内部,不可修改。

(2)按引用 [&] 捕获

int x = 10;
auto lambda = [&]() { x = 20; };
lambda();
std::cout << x;  // ✅ x 被修改为 20

📌 x 传引用,允许 Lambda 修改外部变量。

(3)指定捕获 [x] or [&x]

int x = 10, y = 20;
auto lambda1 = [x]() { std::cout << x; };   // ✅ 仅捕获 x
auto lambda2 = [&y]() { y = 30; };          // ✅ 仅捕获 y 引用

(4)混合捕获 [=, &y]

int x = 10, y = 20;
auto lambda = [=, &y]() { y = x + 5; };
lambda();
std::cout << y;  // ✅ 25

📌 x 复制,y 通过引用传递


5. Lambda 返回类型

(1)自动推导

auto add = [](int a, int b) { return a + b; };  // 自动推导 int

(2)手动指定返回类型

auto divide = [](double a, double b) -> float { return a / b; };

📌 -> float 强制返回 float,否则自动推导为 double


6. Lambda 作为参数

Lambda 可以作为参数传递给函数,例如 STL 算法

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

int main() {
    std::vector<int> vec = {1, 2, 3, 4, 5};
    std::for_each(vec.begin(), vec.end(), [](int x) { std::cout << x * x << " "; });
}

📌 for_each() 里传递 Lambda 进行平方计算


7. Lambda 作为返回值

auto makeLambda() {
    return [](int a, int b) { return a + b; };
}

int main() {
    auto add = makeLambda();
    std::cout << add(3, 4);  // ✅ 7
}

📌 Lambda 作为返回值,返回函数对象。


8. Lambda 存储到 std::function(C++11)

#include <functional>
std::function<int(int, int)> func = [](int a, int b) { return a + b; };
std::cout << func(10, 20);  // ✅ 30

📌 std::function 可以存储 Lambda,用于回调函数。


9. mutable 允许修改值捕获的变量

int x = 10;
auto lambda = [x]() mutable { x += 5; std::cout << x; };
lambda();  // ✅ 输出 15
std::cout << x;  // ❌ x 仍然是 10(原 x 没有变)

📌 mutable 允许修改 x 的副本,但不影响原 x


10. Lambda 在多线程中的使用

#include <iostream>
#include <thread>

int main() {
    std::thread t([] { std::cout << "Hello from thread!\n"; });
    t.join();
}

📌 Lambda 直接传递给 std::thread 进行并行执行!


11. Lambda 适用场景

替代函数指针std::function
STL 算法(for_each, sort, transform
多线程(std::thread, std::async
回调函数(事件处理、网络通信)
函数式编程(组合函数)


12. Lambda vs 普通函数

功能Lambda普通函数
是否匿名✅ 是❌ 需要名字
是否支持外部变量✅ 支持 [capture]❌ 需要手动传参
适用于 STL 算法✅ 适合❌ 需要额外定义
类型推导✅ 自动推导❌ 需要显式返回类型
性能✅ 无额外开销✅ 一样快

🚀 C++ 开发推荐使用 Lambda,可读性强,避免定义额外的函数! 🚀


http://www.kler.cn/a/542125.html

相关文章:

  • 开发完的小程序如何分包
  • 掌握正则表达式_模式匹配的艺术
  • JDK的 Stream 的实现原理
  • CSS3+动画
  • 项目的虚拟环境的搭建与pytorch依赖的下载
  • mysql8 C++源码中创建表函数,表字段最大数量限制,表行最大存储限制
  • 点云配准网络
  • C#中System.Windows.Forms.Application.DoEvents()什么意思?
  • Leetcode1728:猫和老鼠 II
  • 循环依赖是什么?
  • git 子模块管理(一个仓库中有多个子仓库)
  • 02.10 TCP之文件传输
  • 北斗导航 | 基于多假设解分离(MHSS)模型的双星故障监测算法(MATLAB代码实现——ARAIM)
  • SQLServer的创建,表创建,主键,约束,模糊查询
  • 无人机图像拼接数据在GIS中的处理与分析、可视化与制图;无人机航拍;无人机生态环境监测、图像处理与GIS数据分析
  • YOLOv11融合[AAAI2025]的TBSN中的DilatedMDTA模块
  • PTC Windchill介绍
  • PDF另存为图片的一个方法
  • 函数指针(Function Pointer)与 typedef int (*FuncPtr)(int, int);typedef与using(更推荐)
  • SQL最佳实践(笔记)
  • 国产编辑器EverEdit - 批量替换功能
  • 【CXX-Qt】1.1 Rust中的QObjects
  • 2025全新JSP简约博客平台-免费开源
  • deepseek+“D-id”或“即梦AI”快速生成短视频
  • React 中级教程
  • zsh: command not found: conda