C++:Lambda表达式
C++:Lambda表达式
- C++中`lambda`的基本语法
- 1. 捕获列表(Capture List)
- 2. 示例代码
- 示例 1:简单的`lambda`
- 示例 2:捕获变量
- 示例 3:按引用捕获
- 示例 4:捕获所有变量
- 示例 5:作为函数参数
- 3. `lambda`的高级特性
- 4. 适用场景
- 5. 注意事项
- 总结
在C++中,lambda
表达式是一种强大的特性,用于创建匿名函数对象。它从C++11标准开始引入,并在后续版本中不断完善。lambda
表达式在C++中广泛应用于标准库算法(如std::sort
、std::for_each
等)以及其他需要函数对象的场景。
代码链接:https://gitee.com/hu_yuchen/C++11/lambda
C++中lambda
的基本语法
C++的lambda
表达式语法如下:
[capture](parameters) -> return_type { body }
capture
:捕获列表,用于捕获当前作用域中的变量。parameters
:参数列表,类似于普通函数的参数。-> return_type
:返回类型(可选)。如果不指定,编译器会自动推导返回类型。body
:函数体,包含具体的逻辑。
1. 捕获列表(Capture List)
捕获列表用于将当前作用域中的变量捕获到lambda
表达式中。捕获方式有以下几种:
- 按值捕获:使用
[x]
捕获变量x
的副本。 - 按引用捕获:使用
[&x]
捕获变量x
的引用。 - 捕获所有变量:使用
[=]
按值捕获当前作用域中所有变量。 - 捕获所有变量的引用:使用
[&]
按引用捕获当前作用域中所有变量。 - 混合捕获:可以同时使用按值和按引用捕获,例如
[x, &y]
。
2. 示例代码
以下是一些C++中lambda
表达式的典型用法:
示例 1:简单的lambda
#include <iostream>
#include <vector>
#include <algorithm>int main() {std::vector<int> vec = {1, 2, 3, 4, 5};// 使用 lambda 表达式作为回调函数std::for_each(vec.begin(), vec.end(), [](int x) {std::cout << x << " ";});std::cout << std::endl;return 0;
}
输出:
1 2 3 4 5
示例 2:捕获变量
#include <iostream>
#include <vector>
#include <algorithm>int main() {int factor = 2;std::vector<int> vec = {1, 2, 3, 4, 5};// 按值捕获变量 factorstd::for_each(vec.begin(), vec.end(), [factor](int x) {std::cout << x * factor << " ";});std::cout << std::endl;return 0;
}
输出:
2 4 6 8 10
示例 3:按引用捕获
#include <iostream>
#include <vector>
#include <algorithm>int main() {int factor = 2;std::vector<int> vec = {1, 2, 3, 4, 5};// 按引用捕获变量 factorstd::for_each(vec.begin(), vec.end(), [&factor](int x) {std::cout << x * factor << " ";factor++; // 修改捕获的变量});std::cout << std::endl;std::cout << "Final value of factor: " << factor << std::endl;return 0;
}
输出:
2 6 12 20 30
Final value of factor: 7
示例 4:捕获所有变量
#include <iostream>
#include <vector>
#include <algorithm>int main() {int a = 2;int b = 3;// 捕获所有变量auto lambda = [=](){ return a * b; };std::cout << "Result: " << lambda() << std::endl;return 0;
}
输出:
Result: 6
示例 5:作为函数参数
#include <iostream>
#include <vector>
#include <algorithm>void processVector(const std::vector<int>& vec, void (*func)(int)) {for (int x : vec) {func(x);}
}int main() {std::vector<int> vec = {1, 2, 3, 4, 5};// 使用 lambda 表达式作为函数参数processVector(vec, [](int x) {std::cout << x * x << " ";});std::cout << std::endl;return 0;
}
输出:
1 4 9 16 25
3. lambda
的高级特性
- 可调用对象:
lambda
表达式本质上是一个可调用对象,可以赋值给std::function
或其他支持函数调用的类型。 - 默认捕获模式:可以指定默认捕获模式,例如
[=, &x]
表示按值捕获所有变量,但x
按引用捕获。 mutable
关键字:如果lambda
需要修改捕获的变量,可以在lambda
表达式中使用mutable
关键字。auto lambda = [x = 5]() mutable { x++; std::cout << x << std::endl; }; lambda(); // 输出 6
4. 适用场景
- 标准库算法:如
std::sort
、std::for_each
、std::transform
等,lambda
表达式可以作为回调函数传递。 - 线程创建:在
std::thread
中,可以使用lambda
表达式作为线程函数。 - 事件处理:在GUI编程或事件驱动的场景中,
lambda
表达式可以作为事件处理器。 - 简化代码:对于简单的函数逻辑,
lambda
可以减少代码量,使代码更简洁。
5. 注意事项
- 捕获变量的生命周期:如果捕获了局部变量的引用,需要确保
lambda
表达式在变量生命周期内使用,否则可能导致未定义行为。 - 性能开销:虽然
lambda
表达式通常不会引入额外的性能开销,但捕获大量变量可能会增加内存使用。 - 复杂逻辑:对于复杂的逻辑,建议使用普通函数而不是
lambda
表达式,以提高代码的可读性。
总结
C++中的lambda
表达式是一种非常灵活和强大的特性,适用于需要简单函数对象的场景。通过合理使用捕获列表和参数列表,可以实现简洁高效的代码。
相关文章:
C++:Lambda表达式
C:Lambda表达式 C中lambda的基本语法1. 捕获列表(Capture List)2. 示例代码示例 1:简单的lambda示例 2:捕获变量示例 3:按引用捕获示例 4:捕获所有变量示例 5:作为函数参数 3. lambd…...
Vim 中替换字符或文本
在 Vim 中替换字符或文本可以使用 替换命令(substitute),其基本语法为: :[range]s/old/new/[flags]1. 基本替换 命令说明:s/foo/bar/替换当前行的第一个 foo 为 bar:s/foo/bar/g替换当前行的 所有 foo 为 bar:%s/foo/bar/g替换 …...
Thinkphp开发自适应职业学生证书查询系统职业资格等级会员证书管理网站
主要功能介绍 1.PHP MYSQL开发,开源,方便二次开发。 2.后台管理界面清新 3.可批量导入导出数据,格式为:JsoN、CSV、 Excel等。 4.自适应手机端,PC端 5.数据修改,添加,删除非常方便,手机上就可以解决 6.可以增加管理员权限等 7.界面可以个性定制开发...
OpenAI Embedding 和密集检索(如 BERT/DPR)进行语义相似度搜索有什么区别和联系
OpenAI Embedding 和密集检索(如 BERT/DPR)其实是“同一种思想的不同实现”,它们都属于Dense Retrieval(密集向量检索),只不过使用的模型、部署方式和调用方式不同。 🧠 首先搞清楚:…...
C语言复习笔记--数据在内存中的存储
今天我们来复习一下数据在内存中的存储方式.话不多说进入正题. 整数在内存中的存储 整数的2进制表⽰⽅法有三种,即原码、反码和补码.三种表⽰⽅法均有符号位和数值位两部分,符号位都是⽤0表⽰“正”,⽤1表⽰“负”,⽽数值位最⾼位…...
笔试专题(十二)
文章目录 主持人调度题解代码 小红的ABC题解代码 不相邻取数题解代码 空调遥控题解代码 主持人调度 题目链接 题解 1. 排序 2. 先按左端点的大小进行排序,保证时间是连续的,如果后一个点的左端点大于等于前一个点的右端点就是和法的,否则…...
Tauri(2.5.1)+Leptos(0.7.8)开发桌面应用---后台调用Python Matplotlib绘制图形
Rust语言最接近Python Matplotlib绘图库的应该是Plotters,但是试用下来还是没有Matplotlib效果好,所以尝试在Tauri Leptos项目中,后台调用Python Matplotlib绘制图形,并返回给前端Leptos展示。 具体效果如下: 1. 前端…...
Qemu-STM32(十七):STM32F103加入AFIO控制器
概述 本文主要描述了在Qemu平台中,如何添加STM32F103的AFIO控制器模拟代码,AFIO是属于GPIO引脚复用配置的功能。 参考资料 STM32F1XX TRM手册,手册编号:RM0008 添加步骤 1、在hw/arm/Kconfig文件中添加STM32F1XX_AFIO&#x…...
刀客doc:小红书商业技术负责人苍响离职
根据大厂日爆的爆料,小红书商业化再度迎来高层人事变动,原商业平台技术负责人苍响(薯名),职级L2,已于本月正式离职,其下属团队现由电商业务负责人接管。 根据刀客doc获得的资料,苍响…...
CC52.【C++ Cont】滑动窗口
目录 1.题目 2.分析 方法1:暴力枚举 方法2:暴力枚举的优化:"同向双指针",也称滑动窗口 前置知识 核心操作 例子解释 代码 提交结果 1.题目 LCR 008. 长度最小的子数组 给定一个含有 n 个正整数的数组和一个正整数 target 。 找出该数组中满足其和 ≥ target…...
linux中由于编译选项-D_OS64BIT导致的核心已转储问题
linux中由于编译选项-D_OS64BIT导致的核心已转储问题排查解决: 原因: a.so b.so a.so使用b.so 程序1 程序2 使用a.so 程序1运行正常,程序2启动后提示核心已转储。 程序1和程序2运行的代码都一致,只执行创建xApplication app&…...
Ubuntu搭建 Nginx以及Keepalived 实现 主备
目录 前言1. 基本知识2. Keepalived3. 脚本配置4. Nginx前言 🤟 找工作,来万码优才:👉 #小程序://万码优才/r6rqmzDaXpYkJZF 爬虫神器,无代码爬取,就来:bright.cn Java基本知识: java框架 零基础从入门到精通的学习路线 附开源项目面经等(超全)【Java项目】实战CRU…...
Knife4j 接口文档添加登录验证流程分析
Knife4j 接口文档添加登录验证流程是非常必要的,否则接口文档一旦暴露到外面是很危险的,今天我们详细分析一下。在1.9.6的版本时,作者把swagger-bootstrap-ui项目重命名为Knife4j,今天分析2.0.6版本。 1、pom.xml文件引入 <pa…...
C++之string
string 是C中常见的一个用于处理和操作字符串的类。一直有用它来存储字符串,今天来介绍介绍一下它的定义和一些基本用法吧。 1、头文件 #include <string>2、定义和初始化 #include <iostream> #include <string> using namespace std;int main…...
【含文档+PPT+源码】基于SSM的电影数据挖掘与分析可视化系统设计与实现
项目介绍 本课程演示的是一款基于SSM的电影数据挖掘与分析可视化系统设计与实现,主要针对计算机相关专业的正在做毕设的学生与需要项目实战练习的 Java 学习者。 1.包含:项目源码、项目文档、数据库脚本、软件工具等所有资料 2.带你从零开始部署运行本…...
DeepSeek提示词技巧
以下是使用Deepseek等AI工具时提升效果的提示词模式总结,涵盖核心规律、应用场景及效果对比: 规律一:结构化提示(解决模糊性问题) 问题:开放式问题导致回答笼统 模式:角色任务约束输出格式 例子…...
软考高项(信息系统项目管理师)第 4 版全章节核心考点解析(第4版课程精华版)
一、核心输入输出速记体系(力扬老师独家口诀) (一)规划阶段万能输入(4 要素) 口诀:章程计划,组织事业 ✅ 精准对应(ITTO 核心输入): 章程&#…...
【linux网络】网络基础概念
1. 初始协议 1.1 OSI 七层模型 OSI(Open System Interconnection,开放系统互连)七层网络模型称为开放式系统互联参考模型,是一个逻辑上的定义和规范; 把网络从逻辑上分为了 7 层. 每一层都有相关、相对应的物理设备&a…...
【PyTorch动态计算图实战解析】从原理到高效开发
目录 前言技术背景与价值当前技术痛点解决方案概述目标读者说明一、技术原理剖析核心概念图解核心作用讲解关键技术模块说明技术选型对比二、实战演示环境配置要求核心代码实现案例1:梯度计算可视化案例2:动态控制流案例3:自定义反向传播运行结果验证三、性能对比测试方法论…...
【专题五】位运算(1):常见位运算操作总结
📝前言说明: 本专栏主要记录本人的基础算法学习以及LeetCode刷题记录,按专题划分每题主要记录:(1)本人解法 本人屎山代码;(2)优质解法 优质代码;ÿ…...
react-native-vector-icons打包报错并且提示:copyReactNativeVectorIconFonts相关信息
使用react-native-vector-icons,打包时会报: FAILURE: Build failed with an exception. * What went wrong: Some problems were found with the configuration of task :app:copyReactNativeVec torIconFonts (type Copy).- Gradle detected a proble…...
【Sqlalchemy Model转换成Pydantic Model示例】
【Sqlalchemy Model转换成Pydantic Model示例】 由于Sqlalchemy和Pydantic的模型字段类型可能有差异, 所以需要一个通用的装换类 def sqlalchemy_to_pydantic_v2(sqlalchemy_model, pydantic_model):"""通用函数,将 SQLAlchemy 模型实例转换为 Pyd…...
探索语音增强中的多尺度时间频率卷积网络(TFCM):代码解析与概念介绍
探索语音增强中的多尺度时间频率卷积网络(TFCM):代码解析与概念介绍 在现代音频处理领域,语音增强技术始终是一个备受关注的研究热点。其主要目标是通过去除背景噪声、回声或其他混杂信号,提升语音通话或录音的质量。…...
私有知识库 Coco AI 实战(四):打造 ES 索引参数小助手
经过前面的实战,我们已经能够快速、准确的检索 ES 官方文档的内容了,但是还是要自己去阅读。既然 Coco AI 能与大模型交互,我们何不直接用大模型来阅读文档,回答我们的问题? 模型配置 我们进入 Coco AI 管理后台&…...
苍穹外卖心得体会
1 登录认证 技术点:JWT令牌技术(JSON Web Token) JWT(JSON Web Token)是一种令牌技术,主要由三部分组成:Header头部、Payload载荷和Signature签名。Header头部存储令牌的类型(如JW…...
Ubuntu上搭建python环境并安装第三方库
Ubuntu上搭建python环境并安装第三方库 更新系统包列表安装Python和pip验证安装创建并使用虚拟环境虚拟环境中安装第三方库编写并测试python脚本运行.py文件 使用Ubuntu 24.04搭建python环境并安装第三方库 更新系统包列表 sudo apt update安装Python和pip sudo apt install…...
redis高阶2 高性能
灵魂拷问: redis 为什么块? 纯内存访问单线程避免上下文切换渐进式ReHash , 缓存时间戳 Redis 的 key 和 value组织结构: 全局哈希表: 为了实现从键到值的快速访问。 redis 使用了一个哈希表 来保存所有键值对。一个哈希表 其实就…...
go编解码json和http请求
1.json概述 json是日常工作中http请求的最重要的数据格式。对比日常使用python中的json,获得http请求后json.loads和json.dumps函数,go中显的非常麻烦,这里结合json和http请求的总结下,便于积累和学习。这里给出一个json的类型&a…...
洛谷题解 | CF1979C Earning on Bets
目录 题目描述输入格式输出格式输入输出样例 #1输入 #1输出 #1 说明/提示题目思路AC 代码 题目描述 You have been offered to play a game. In this game, there are $ n $ possible outcomes, and for each of them, you must bet a certain integer amount of coins. In th…...
在线文章系统自动化测试报告
目录 1. 项目简介 1.1. 用户登录页面 1.2. 文章列表页面 1.3. 文章详情页面 1.4. 文章编辑与发布页面 2. 测试计划 3. 测试环境/工具/技术栈 4. 编写自动化测试用例编辑 5. 自动化测试脚本开发 5.1. 项目整体结构 5.2. 配置utils.py 5.2.1. 导入必要的库 5.2.2.…...
C++ 类和对象(3)初始化列表、友元函数、内部类
文章目录 再谈构造函数构造函数体内赋值 初始化列表初始化列表特点 类型转换static成员static特点C11中成员初始化的新用法 友元友元函数友元函数特点 友元类友元类的特点 内部类内部类的特点 再谈构造函数 构造函数体内赋值 当我们创建对象时,编译器会调用构造函…...
CF4C Registration system(哈希实现)
解题思路:因为这道题在每次输入一个字符串后,都需要进行一次查找以判断是否需要按照规则生成新的用户名,故这道题使用STL容器map进行哈希是最合适的(map的查找时间复杂度为log n),在题目描述中,如果用户名已经被注册&a…...
DDI0487--A1.7
Introduction RAS(Reliability,Availability,Serviceability) RAS是衡量一个系统可靠性的三个方面: Reliability——持续提供正确服务的能力。 Availability——正确提供服务的准备状态。 Serviceability——能够进行修改和修复的能力。 R…...
MySQL事务(transaction)(笔记)
事务(Transaction)(必须掌握必须理解) 1.什么是事务? 一个事务是一个完整的业务逻辑单元(一个业务逻辑单元常常涉及到多条DML语句共同执行完成),不可再分(最小的工作单元) 一个事务就是一个业务,完成一个…...
ADS1299模拟前端(AFE)代替芯片——LHE7909
在现代医疗科技的飞速发展中,精确的生物电势测量设备变得越来越重要。领慧立芯推出的LHE7909,是一款专为心电图(ECG)和其他生物电势测量设计的低噪声24位模数转换器(ADC),为医疗设备制造商提供了…...
(三十二)Android开发中AppCompatActivity和Activity之间的详细区别
在 Android 开发中,AppCompatActivity 和 Activity 是两个核心类,用于创建和管理应用程序的用户界面。尽管它们功能上有重叠,但它们之间存在显著的区别。本文将详细讲解 AppCompatActivity 和 Activity 的区别,并结合代码示例和具…...
Neo4j 的 `SET n += $properties` 语法详解
Neo4j 的 SET n $properties 语法详解 SET n $properties 是 Neo4j Cypher 查询语言中的一个非常有用的语法,用于更新节点或关系的属性。让我详细解释它的含义和工作原理: 基本含义 SET:Cypher 中用于修改属性或标签的关键字n࿱…...
springboot 框架把 resources下的zip压缩包, springboot 项目启动后解压到项目根目录工具类
最近有一个需求,在开发的时候 有一些c的扩展文件 需要放到服务器上,如果手动放上去,给用户部署项目就很麻烦,就根据这个需求,先把项目需要的 扩展文件 打包成zip压缩包 然后项目启动的时候 把resources文件夹下的 zip压…...
指针(5)
1.sizeof 和 strlen 的对比 1.1sizeof sizeof 是操作符,sizeof 计算变量所占内存空间的大小,单位是字节,如果操作数是类型的话,计算的是使用类型创建的变量所占空间的大小。 sizeof 只关注占用内存的空间的大小,不在…...
机器学习day4-Knn+交叉验证api练习(预测facebook签到位置)
数据集:FackebookV : 预测 row id:签⼊事件的id x y:坐标 accuracy: 准确度,定位精度 time: 时间戳 place_id: 签到的位置,需要预测的内容 具体步骤: # 1.获取数据集 # 2.基本数据处理 # 2.1 缩⼩数据…...
AI工具 Trae 创建java项目和配置运行环境完整示例
以下是使用字节跳动 Trae IDE 创建 Java 项目并配置运行环境的完整示例,结合其核心功能和搜索结果的实践案例整理: 一、环境准备与安装 下载与安装 访问 Trae 官网 下载 Windows 或 macOS 版本客户端,安装完成后选择中文界面和主题(推荐 Dark/DeepBlue 主题)。首次启动时支…...
【论文_序列转换模型架构_20230802v7】Attention Is All You Need 【Transformer】
https://arxiv.org/abs/1706.03762 20170612 v1 代码实现_notebook ∗Equal contribution. Listing order is random. Jakob proposed replacing RNNs with self-attention and started the effort to evaluate this idea. 提出用 self-attention 替代 RNNs,并开始…...
清晰易懂的跨域请求知识——拿捏
1. 什么是跨域请求? 简单来说:当你的 前端网页(例如 http://frontend.com)通过 JavaScript 调用 后端接口(例如 http://backend.com/api)时,如果两者的 域名、端口、协议 中任意一项不同&#…...
前端漏洞不扫描理由
漏洞类型豁免理由基于DOM的XSS1.已实施安全加固: 使用encodeURIComponent对URL参数进行编码 对特殊字符(<>“”&)进行HTML实体转义 使用template literal替代字符串拼接 移除了直接操作DOM的不安全写法,二次扫描仍然扫描出来,且修改建议模糊 2…...
论文阅读的三个步骤
论文阅读的三个步骤 方法说明链接:https://www.academia.edu/4907403/How_to_Read_a_Paper 方法框架如下...
Javascript 中的继承?如何实现继承?
一、继承的本质 继承:子对象可以自动拥有父对象的属性和方法,就像孩子继承父母的基因。JavaScript 的继承:通过原型链实现(原型和原型链是底层核心)。 二、4 种常见继承方式 1. 原型链继承(传家宝模式&am…...
深入理解 Linux 权限管理:从基础到进阶
在 Linux 系统中,权限管理是保障系统安全与资源合理分配的核心机制。无论是服务器管理员,还是日常使用 Linux 的开发者,深入掌握权限管理,不仅能避免因权限设置不当导致的数据泄露或系统故障,还能灵活高效地管理各类资…...
第1阶段-前5天-考试题及答案
文章目录 1.1 用户 root 的家目录是哪里?1.2 如何查询 linux 系统 ip 地址?1.3 检查是否可以访问 baidu.com 的命令?1.4 [rootoldboy-c7 /etc/sysconfig/ ]# 说说每一部分含义?1.5 说说 Linux 常见快捷键?(至少 3 个)1.6 Windows 分为 C 盘,D 盘,但是 Linux 一切从 根或/ …...
农村供水智能化远程监控解决方案
农村供水智能化远程监控解决方案 ——基于巨控GRM242Q-4D4I4Q(HE)模块的快速部署方案 一、项目需求与痛点 某西南山区农村供水项目需管理12个分散站点,每个站点包含: 4-20mA模拟量:压力传感器、流量计485通信设备:智能水表&…...
4月29日星期二今日早报简报微语报早读
4月29日星期二,农历四月初二,早报#微语早读。 1、特朗普声称中方领导人打了电话,外交部:近期中美元首没有通话; 2、跳水世界杯总决赛名单出炉,“梦之队”全主力出战; 3、深圳:对年…...