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

一、引入

在 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.rhkb.cn/news/37566.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

uniapp 实现的下拉菜单组件

采用 uniapp 实现, 是一款具备丝滑折叠、展开动画的下拉菜单&#xff0c;支持 vue2、vue3&#xff1b;适配 web、H5、微信小程序&#xff08;其他平台小程序未测试过&#xff0c;可自行尝试&#xff09; 可到插件市场下载尝试&#xff1a; https://ext.dcloud.net.cn/plugin?i…

【一维前缀和与二维前缀和(简单版dp)】

1.前缀和模板 一维前缀和模板 1.暴力解法 要求哪段区间&#xff0c;我就直接遍历那段区间求和。 时间复杂度O(n*q) 2.前缀和 ------ 快速求出数组中某一个连续区间的和。 1&#xff09;预处理一个前缀和数组 这个前缀和数组设定为dp&#xff0c;dp[i]表示&#xff1a;表示…

ubuntu部署运行xinference全精度对话deepseek本地部署图文教程

前置环境搭建劳请移步往期 source activate 自己环境名启动python3.12环境安装xinference&#xff0c; 按教程敲命令&#xff0c;wheel包与wsl的通用&#xff0c;pip install 包名。 vllm引擎&#xff0c;transform引擎也会顺带自动装上了。 后续操作请参照往期教程。本地部署模…

Python 面向对象三大特性深度解析

一、封装&#xff08;Encapsulation&#xff09; 1. 私有化实现 class BankAccount:def __init__(self, account_holder, balance0):self.__holder account_holder # 双下划线私有属性self.__balance balance# 公有方法访问私有属性def deposit(self, amount):if amount &…

星越L_陡坡缓降使用讲解

目录 1.陡坡缓降 1.陡坡缓降 中控屏下滑-点击陡坡缓降功能 35km/h以下时生效。35km/h-60km/h该功能暂停 60km/h以上该功能关闭

多路FM调频广播解调器:多路电台FM广播信号一体化解调处理方案

多路FM调频广播解调器&#xff1a;多路电台FM广播信号一体化解调处理方案 支持OEM型号开放式协议支持二次开发设计 北京海特伟业科技有限公司任洪卓发布于2025年3月21日 在信息传播领域&#xff0c;FM调频广播媒体以其独特的优势持续发挥着重要作用。为了应对日益增长的多路…

报错 - redis - Unit redis.service could not be found.

报错&#xff1a; Unit redis.service could not be found.Could not connect to Redis at 127.0.0.1:6379: Connection refused解决方法&#xff1a; 检查状态、有必要的话 重新安装 Linux 上查看状态 systemctl status redis显示以下内容&#xff0c;代表正常服务 出现下面…

Guava:Google开源的Java工具库,太强大了

&#x1f9d1; 博主简介&#xff1a;CSDN博客专家&#xff0c;历代文学网&#xff08;PC端可以访问&#xff1a;https://literature.sinhy.com/#/?__c1000&#xff0c;移动端可微信小程序搜索“历代文学”&#xff09;总架构师&#xff0c;15年工作经验&#xff0c;精通Java编…

Pytorch中layernorm实现详解

平时我们在编写神经网络时&#xff0c;经常会用到layernorm这个函数来加快网络的收敛速度。那layernorm到底在哪个维度上进行归一化的呢&#xff1f; 一、问题描述 首先借用知乎上的一张图&#xff0c;原文写的也非常好&#xff0c;大家有空可以去阅读一下&#xff0c;链接放…

六十天前端强化训练之第二十五天之组件生命周期大师级详解(Vue3 Composition API 版)

欢迎来到编程星辰海的博客讲解 看完可以给一个免费的三连吗&#xff0c;谢谢大佬&#xff01; 目录 一、生命周期核心知识 1.1 生命周期全景图 1.2 生命周期钩子详解 1.2.1 初始化阶段 1.2.2 挂载阶段 1.2.3 更新阶段 1.2.4 卸载阶段 1.3 生命周期执行顺序 1.4 父子组…

Burp Suite 代理配置与网络通信

目录 1. 引言 2. Burp 代理基础配置 2.1 浏览器代理设置 2.2 Burp 监听端口配置 2.3 常见错误排查 3. 网络问题解决 3.1 端口占用检查 3.2 防火墙配置 3.3 证书信任问题 4. 虚拟机环境配置 4.1 NAT 模式与端口转发 4.2 桥接模式配置 4.3 跨设备访问测试 5. 技术概…

numpy学习笔记16: 1000 次独立随机游走实验(绘制其分布直方图,同时叠加理论正态分布曲线)

numpy学习笔记16&#xff1a; 1000 次独立随机游走实验(绘制其分布直方图&#xff0c;同时叠加理论正态分布曲线) 以下是这段代码(全部代码在最后)的详细分步解释&#xff0c;结合统计学原理和可视化技巧&#xff1a; 1. 代码功能概述 这段代码通过 1000 次独立随机游走实验&…

C# 项目06-计算程序运行时间

实现需求 记录程序运行时间&#xff0c;当程序退出后&#xff0c;保存程序运行时间&#xff0c;等下次程序再次启动时&#xff0c;继续记录运行时间 运行环境 Visual Studio 2022 知识点 TimeSpan 表示时间间隔。两个日期之间的差异的 TimeSpan 对象 TimeSpan P_TimeSpa…

KNN算法

一、KNN算法介绍 KNN 算法&#xff0c;也称 k邻近算法&#xff0c;是 有监督学习 中的 分类算法 。它可以用于分类或回归问题&#xff0c;但它通常用作分类算法。 二、KNN算法流程 1.计算已知类别数据集中的点与当前点的距离 2.按照距离增次序排序 3.选取与当前点距离最小…

星越L_可调悬挂使用讲解

目录 1.可变阻尼设置 1.可变阻尼设置

G-Star 校园开发者计划·黑科大|开源第一课之 Git 入门

万事开源先修 Git。Git 是当下主流的分布式版本控制工具&#xff0c;在软件开发、文档管理等方面用处极大。它能自动记录文件改动&#xff0c;简化合并流程&#xff0c;还特别适合多人协作开发。学会 Git&#xff0c;就相当于掌握了一把通往开源世界的钥匙&#xff0c;以后参与…

html5炫酷3D立体文字效果实现详解

炫酷3D立体文字效果实现详解 这里写目录标题 炫酷3D立体文字效果实现详解项目概述技术实现要点1. 基础布局设置2. 动态背景效果3. 文字渐变效果4. 立体阴影效果5. 悬浮动画效果 技术难点及解决方案1. 文字渐变动画2. 立体阴影效果3. 性能优化 浏览器兼容性总结 项目概述 在这个…

《白帽子讲 Web 安全》之开发语言安全深度解读

目录 引言 1.PHP 安全 1.1变量覆盖 1.2空字节问题 1.3弱类型 1.4反序列化 1.5安全配置 2Java 安全 2.1Security Manager 2.2反射 2.3反序列化 3Python 安全 3.1反序列化 3.2代码保护 4.JavaScript 安全 4.1第三方 JavaScript 资源 4.2JavaScript 框架 5.Node.…

django设置admin的排列顺序,耗3小时【躲坑指南】

django 项目中&#xff0c;这个数据栏目的显示排列顺序我希望更贴近业务 比如要让【商品货品信息】中的9个数据表根据人为规定来进行排序 结果&#xff1a;工程量很大。 能够实现人为的自定义排序 最简单的设置就是给模型添加号数标记 主应用中创建admin–设置了其中一个应用…

macOS使用brew切换Python版本【超详细图解】

目录 一、更新Homebrew仓库 二、安装pyenv 三、将pyenv添加到bash_profile文件中 四、使.bash_profile文件的更改生效 五、安装需要的Python版本 六、设置全局使用的Python版本 七、检查Python版本是否切换成功 pyenv常用命令 一、更新Homebrew仓库 brew update 这个…