【C++基础】Lambda 函数 基础知识讲解学习及难点解析

news/2025/3/24 4:25:28/

一、引入

在 C++ 中,我们通常使用函数来完成特定的功能。但有时候,我们需要在一个函数内部定义一个小型的功能块,这时如果单独写一个函数会显得繁琐。C++11 引入了 Lambda 函数,它是一种匿名函数,可以在需要的地方直接定义和使用,非常适合用于简化代码。

二、Lambda函数的基本用法

1.语法模板(看不懂没关系,看完实例就理解了)

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

逐部分讲解

1.捕获列表 []:

用于捕获外部变量,决定 Lambda 函数如何访问外部作用域的变量。

常见形式:

[]:不捕获任何变量。

[=]:以值的方式捕获所有外部变量。

[&]:以引用的方式捕获所有外部变量。

[x, &y]:以值捕获 x,以引用捕获 y。

2.参数列表 ():

和普通函数的参数列表一样,用于传递参数。

3.返回类型 -> 返回类型:

可以省略,编译器会自动推导返回类型。

如果函数体中有多个返回语句,且类型不一致,则需要显式指定返回类型。

4.函数体 {}:

实现具体的功能逻辑。

示例

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

三、 Lambda 函数的捕获列表详解

示例 1:不捕获任何变量

int x = 10;
auto func = []() {// x 不可访问,编译错误// std::cout << x;
};

示例 2:以值的方式捕获变量

int x = 10;
auto func = [x]() {std::cout << x; // 输出: 10
};
x = 20;
func(); // 输出仍然是 10,因为捕获的是值

此时函数捕获的是x的数值:10,而不是x这个变量,因此外界对x更改不会影响函数中10这个数

示例 3:以引用的方式捕获变量

int x = 10;
auto func = [&x]() {std::cout << x; // 输出: 10
};
x = 20;
func(); // 输出: 20,因为捕获的是引用

此时函数捕获的是x这个变量,区别于上面那种

示例 4:混合捕获

int x = 10, y = 20;
auto func = [x, &y]() {std::cout << x << " " << y; // 输出: 10 20y = 30; // 修改 y 的值
};
func();
std::cout << y; // 输出: 30

四、Lambda 函数的实际应用

示例 :STL 算法中的 Lambda 函数

#include <iostream>
#include <vector>
#include <algorithm>int main() {std::vector<int> nums = {3, 1, 4, 1, 5, 9};std::sort(nums.begin(), nums.end(), [](int a, int b) {return a > b; // 降序排序});for (int num : nums) {std::cout << num << " "; // 输出: 9 5 4 3 1 1}return 0;
}

五、总结与注意事项

总结

  1. Lambda 函数是一种匿名函数,适合用于简化代码和实现小型功能。

  2. 捕获列表决定了 Lambda 函数如何访问外部变量。

  3. Lambda 函数常用于 STL 算法和回调函数中。

注意事项

  1. 捕获列表的使用需要谨慎,避免不必要的值拷贝或引用捕获。

  2. 如果 Lambda 函数的逻辑较复杂,建议单独写一个普通函数。

六、易混辨析与深入理解

1.[ ]< >的大乱斗

(1)两者区别

特性[](捕获列表)<>(模板参数列表)
用途用于 Lambda 函数,定义如何捕获外部变量用于模板,定义类型参数
位置出现在 Lambda 函数的开头出现在模板类或模板函数的定义或调用处
内容捕获方式(值、引用等)类型参数(如 int等)

它们的作用域和语法规则是独立的,没有任何关联。

(2)如何选取

int x = 10;
auto func = [x](int y) -> int {return x + y; // 捕获 x,参数 y
};
std::cout << func(5); // 输出: 15

例如上面的程序,为什么不写成下面的:

int x = 10;
auto func = [](int x,int y) -> int {return x + y; 
};
std::cout << func(x,5); // 输出: 15

分析解答:

特性直接传递参数使用捕获列表
依赖外部变量不依赖,x 通过参数传递依赖,x 通过捕获列表捕获
参数传递每次调用都需要显式传递 xx 在 Lambda 函数内部直接可用
性能可能产生额外的拷贝开销引用捕获可以避免拷贝开销
代码可读性更直观,逻辑清晰可能降低可读性,尤其是捕获列表复杂时
适用场景适合简单的、独立的功能适合需要封装外部状态的场景

 (3)为什么选择捕获列表?

场景 1:封装外部状态
int x = 10;
auto func = [x]() {std::cout << "Captured x: " << x;
};
x = 20; // 修改外部 x
func(); // 输出: Captured x: 10
场景 2:避免重复传递参数
int x = 10;
auto func = [x](int y) {return x + y; // 不需要每次调用都传递 x
};
std::cout << func(5); // 输出: 15
std::cout << func(10); // 输出: 20
场景 3:引用捕获避免拷贝
std::vector<int> data = {1, 2, 3};
auto func = [&data]() {data.push_back(4); // 修改外部 data
};
func();
std::cout << data.size(); // 输出: 4

2.[&] 和 [&x]的区别

[&]:以引用的方式捕获所有外部变量

作用:捕获所有外部变量,并以引用的方式访问它们。

  • 特点

    • 简洁,不需要显式列出所有变量。

    • 适合需要捕获多个变量的场景。

    • 可读性较差,因为不清楚具体捕获了哪些变量。

[&x]:以引用的方式捕获特定变量

作用:只捕获指定的变量 x,并以引用的方式访问它。

  • 特点

    • 明确,清楚地知道捕获了哪个变量。

    • 适合只需要捕获少量变量的场景。

    • 可读性较好,但可能会显得冗长。


http://www.ppmy.cn/news/1581159.html

相关文章

doris:负载均衡

用户通过 FE 的查询端口&#xff08;query_port&#xff0c;默认 9030&#xff09;使用 MySQL 协议连接 Doris。当部署多个 FE 节点时&#xff0c;用户可以在多个 FE 之上部署负载均衡层来实现 Doris 查询的高可用。 本文档介绍多种适用于 Doris 的负载均衡方案&#xff0c;并…

XSS 绕过分析:一次循环与两次循环的区别

目录 代码分析 代码流程&#xff1a; 一次循环的问题 原因分析&#xff1a;删除顺序导致遗漏 两次循环修复方案 两种绕过方式 绕过方法 1&#xff1a;DOM破环 绕过方法 2&#xff1a;SVG XSS&#xff08;双 SVG 绕过&#xff09; 1. 为什么 "一个SVG注定失败&…

[特殊字符] 2025蓝桥杯备赛Day8——B2118 验证子串

&#x1f50d; 2025蓝桥杯备赛Day8——B2118 验证子串 &#x1f680; 题目速览 题目难度&#xff1a;⭐️ 适合掌握字符串基本操作 考察重点&#xff1a;子串判断、字符串查找、条件分支处理 B2118 验证子串 题目描述 输入两个字符串&#xff0c;验证其中一个串是否为另一…

光影香江聚四海,蓝陵科技扬帆数字内容新蓝海

3月20日&#xff0c;第29届香港国际影视展&#xff08;FILMART&#xff09;圆满收官&#xff0c;这场亚洲顶级行业盛会吸引了34个国家和地区逾760家机构参展&#xff0c;搭建起全球影视产业深度对话的桥梁。蓝陵科技携三大创新数字解决方案惊艳亮相&#xff0c;与各国行业领袖共…

如何通过Python实现自动化任务:从入门到实践

在当今快节奏的数字化时代,自动化技术正逐渐成为提高工作效率的利器。无论是处理重复性任务,还是管理复杂的工作流程,自动化都能为我们节省大量时间和精力。本文将以Python为例,带你从零开始学习如何实现自动化任务,并通过一个实际案例展示其强大功能。 一、为什么选择Pyt…

【PCIe 总线及设备入门学习专栏 3.2 -- PCIe 在进行大数据搬运时是如何组包的?】

文章目录 Overview1. PCIe数据传输的核心机制(1) 数据分割(2) TLP头部构造(3) 数据链路层封装(4) 物理层传输2. GPU从内存搬运数据的组包流程场景示例:3. 优化机制(1) 大页传输(TLP合并)(2) 流量控制与信用机制(3) 地址对齐优化4. 完整示例5. 性能影响Overview 本文将详细介…

现代美学工业风品牌海报徽标设计PSAI无衬线英文字体安装包 Moldin – Condensed Sans Serif Font

现代几何工业风品牌海报徽标设计无衬线英文字体安装包 Moldin — Condensed Sans Serif Font Moldin 是一个粗体浓缩的无衬线字体系列&#xff0c;旨在为显示和标题提供最大的影响。Moldin 有 6 种粗细可供选择&#xff0c;从常规到黑色&#xff0c;提供静态和可变格式&#x…

基于大模型的下颌前突畸形预测及治疗方案研究报告

目录 一、引言 1.1 研究背景 1.2 研究目的 1.3 研究意义 二、大模型技术原理与应用现状 2.1 大模型的基本原理 2.2 在医疗领域的应用案例 2.3 在下颌前突畸形研究中的可行性分析 三、下颌前突畸形概述 3.1 定义与分类 3.2 流行病学特征 3.3 病因与发病机制 3.4 对…