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

【C++11】详解lambda!

一、lambda表达式语法1.lambda表达式本质是一个数对匿名函象跟普通函数不同的是它可以定义在函数内部。lambda表达式语法使用层而言没有类型所以我们一般是用auto或者模板参数定义的对象去接收lambda对象。2.lambda表达式的格式 [capture-list] (parameters)- return type {function body}3.[capture-list]:捕捉列表该列表总是出现在lambda函数的开始位置编译器根据[]来判断接下来的代码是否为lambda函数捕捉列表能够捕捉上下文中的变量供lambda函数使用捕捉列表可以传值和传引用捕捉。捕捉列表为空也不能省略。4.(parameters):参数列表与普通函数的参数列表功能类似如果不需要参数传递则可以连同一起省略。5.- return type返回值类型用追踪返回类型形式声明函数的返回值类型没有返回值此部分可省略。一般返回值类型明确的情况下也可省略由编译器对返回类型进行推导。6.{function body}函数体函数体内的实现跟普通函数完全类似在函数体内除了可以使用其参数外还可以使用所有捕获到的变量函数体为空也不能省略。//语法 int main() { auto add1 [](int x, int y)-int {return x y; }; cout add1(2, 3) endl; //1.捕捉列表为空也不能省略 //2.参数为空可以省略 //3.返回值可以省略它可以通过返回对象自动推导 //4.函数体不能省略 auto func1 [] { cout hello endl; return 0; }; func1(); int a 0, b 1; auto swap1 [](int x, int y) { int tmp x; x y; y tmp; }; swap1(a, b); cout a : b endl; return 0; }二、捕捉列表1.lambda表达式中默认只能用lambda函数体和参数中的变量如果想用外层作用域中的变量就需要进行捕捉2.第一种捕捉方式是在捕捉列表中显示的传值捕捉和传引用捕捉捕捉的多个变量用逗号分割。[x,y,z]表示x和y值捕捉z引用捕捉3.第二种捕捉方式是在捕捉列表中隐式捕捉我们在捕捉列表写一个表示隐式值捕捉写一个表示隐式引用捕捉这样我们lambda表达式中用了哪些变量编译器就会自动捕捉哪些变量。4.第三种捕捉方式是在捕捉列表种混合使用隐式捕捉和显示捕捉。[,x]表示其他变量隐式值捕捉x引用捕捉[xy]表示其他变量隐式引用捕捉x和y值捕捉。当使用混合捕捉时第一个元素必须是或并且混合捕捉时后面的捕捉变量必须是值捕捉同理混合捕捉时后面的捕捉变量必须是引用捕捉。5.lambda表达式如果在函数局部域中他可以捕捉lambda位置之前定义的变量不能捕捉静态局部变量和全局变量静态局部变量和全局变量也不需要捕捉lambda表达式中可以直接使用。这也意味着lambda表达式如果定义在全局位置捕捉列表必须为空。6.默认情况下lambda捕捉列表是被const修饰的也就是说传值捕捉的过来的对象不能修改mutable加在参数列表的后面可以取消其常量性也就是说使用该修饰符后传值捕捉的对象就可以修改了但是修改的是形参对象不会影响实参。使用该修饰符后参数列表不可省略即使参数为空int x 0; auto func1 []()//捕捉列表必须为空因为全局变量不用捕捉就可以用没有可捕捉的变量 { x; }; int main() { //只能用当前lambda局部域捕捉的对象全局对象 int a 0, b 1, c 2, d 3; auto func1 [a, b] { //值捕捉的变量不能修改引用捕捉可以修改 b; int ret a b; return ret; }; cout func1() endl; //隐式值捕捉 //用了哪些变量就捕捉哪些变量不能修改 auto func2 [] { int ret a b c; return ret; }; cout func2() endl; //隐式引用捕捉 //用了哪些变量就捕捉哪些变量能修改 auto func3 [] { a; b; c; }; func3(); cout a b c d endl; //混合捕捉 auto func4 [, a, b] { //a、b值捕捉不能修改 //a; //b; c; d; return a b c d; }; func4(); cout a b c d endl; auto func5 [, a, b] { //除了a、b值都不能修改 a; b; /*c; d;*/ return a b c d; }; func4(); cout a b c d endl; //局部的静态和全局变量不能捕捉也不需要捕捉 static int m 0; auto func6 [] { int ret x m; return ret; }; cout func6() endl; //mutable相当于去掉const属性就可以修改了 //但是修改了不会影响外面被捕捉的值因为是一种拷贝 auto func7 []()mutable { a; b; c; d; return a b c d; }; cout func7() endl; cout a b c d endl; return 0; }三、lambda的应用在学习lambda表达式之前我们的使用的可调用对象只有函数指针和仿函数对象函数指针的类型定义起来比较麻烦仿函数要定义一个类相对会比较麻烦。使用lambda去定义可调用对象既简单又方便。//lambda的使用 struct Goods { string _name; double _price; int _evaluate; //... Goods(const char* str, double price, int evaluate) :_name(str) ,_price(price) ,_evaluate(evaluate) {} }; //仿函数 struct ComparePriceLess { bool operator()(const Goods gl, const Goods gr) { return gl._price gr._price; } }; struct ComparePriceGreater { bool operator()(const Goods gl, const Goods gr) { return gl._price gr._price; } }; int main() { vectorGoods v { {苹果,5.5,1},{香蕉,1.8,2}, {梨,2.3,2} }; //类似这样的场景我们实现仿函数对象或者函数指针支持商品中不同项的比较。相对还是比较麻烦的这里用lambda解决就很方便 sort(v.begin(), v.end(), ComparePriceGreater()); sort(v.begin(), v.end(), ComparePriceLess()); //lambda sort(v.begin(), v.end(), [](const Goods g1, const Goods g2) { return g1._price g2._price; }); sort(v.begin(), v.end(), [](const Goods g1, const Goods g2) { return g1._evaluate g2._evaluate; }); sort(v.begin(), v.end(), [](const Goods g1, const Goods g2) { return g1._evaluate g2._evaluate; }); return 0; }四、lambda的原理lambda的原理和范围for很像编译后从汇编指令层来看压根就没有lambda和范围for这样的东西。范围for底层是迭代器而lambda底层是仿函数对象也就是说我们写了一个lambda以后编译器会生成一个对应的仿函数的类。仿函数的类名是编译按一定规则生成的保证不同的lambda生成的类名不同lambda参数/返回类型/函数体就是仿函数operator的参数/返回类型/函数体lambda的捕捉列表本质是生成仿函数类的成员变量也就是说捕捉列表的变量都是lambda类构造参数的实参当然隐式捕捉编译器要看使用哪些就传哪些对象。class Rate { public: Rate(double rate) :_rate(rate) {} double operator()(double money, int year) { return money * _rate * year; } private: double _rate; }; int main() { double rate 0.49; //lambda auto r2 [rate](double money, int year) { return money * rate * year; }; //函数对象 Rate r1(rate); r1(10000, 3); coutr2(10000, 3)endl; return 0; }

相关文章:

【C++11】详解lambda!

一、lambda表达式语法1.lambda表达式本质是一个数对匿名函象,跟普通函数不同的是它可以定义在函数内部。lambda表达式语法使用层而言没有类型,所以我们一般是用auto或者模板参数定义的对象去接收lambda对象。2.lambda表达式的格式 :[capture-…...

StructBERT文本相似度效果展示:‘预约挂号’vs‘怎么挂专家号’相似度0.74实录

StructBERT文本相似度效果展示:‘预约挂号’vs‘怎么挂专家号’相似度0.74实录 1. 引言:当AI理解医疗问句的深层含义 想象一下这样的场景:一位患者在医院网站上输入"怎么挂专家号",而知识库里的标准问题是"预约挂…...

Qwen2.5推理延迟优化:批处理部署实战技巧

Qwen2.5推理延迟优化:批处理部署实战技巧 如果你正在用Qwen2.5这类大模型做网页推理服务,大概率遇到过这样的场景:用户一个接一个地提问,服务器忙得团团转,但每个请求都得排队等,响应时间越来越长。用户等…...

CasRel模型实战案例:从新闻文本中批量抽取人物-组织-职务关系

CasRel模型实战案例:从新闻文本中批量抽取人物-组织-职务关系 1. 认识CasRel关系抽取模型 CasRel(Cascade Binary Tagging Framework)是一个专门从文本中自动提取实体关系的AI模型。想象一下,你有一大堆新闻文章,需要…...

Youtu-VL-4B-Instruct惊艳表现:多图关联推理——‘哪张图中的椅子最符合人体工学’

Youtu-VL-4B-Instruct惊艳表现:多图关联推理——‘哪张图中的椅子最符合人体工学’ 你有没有想过,让AI帮你从一堆产品图片里,挑出最符合人体工学的那一个?听起来像是设计师或者产品经理的活儿,对吧?但今天…...

MedGemma 1.5实战案例:基于MedQA数据集的鉴别诊断能力验证分享

MedGemma 1.5实战案例:基于MedQA数据集的鉴别诊断能力验证分享 1. 引言:为什么需要验证医疗AI的诊断能力? 最近,一个朋友在聊天时提到,他父亲身体不适,在网上查了半天症状,结果越看越心慌&…...

HY-MT1.5-1.8B跨境电商应用:商品详情自动翻译部署方案

HY-MT1.5-1.8B跨境电商应用:商品详情自动翻译部署方案 跨境电商卖家每天都要面对一个头疼的问题:商品详情页的翻译。把中文介绍翻译成英文、法文、德文……不仅工作量大,找专业翻译成本高,自己用工具翻出来的内容又常常词不达意&…...

GME-Qwen2-VL-2B-Instruct效果展示:农业病虫害图谱与防治建议文本匹配

GME-Qwen2-VL-2B-Instruct效果展示:农业病虫害图谱与防治建议文本匹配 想象一下,你是一位农业技术员,面对一张叶片上布满病斑的作物照片,需要从几十条防治建议中,快速找到最对症的那一条。传统方法要么靠经验&#xf…...

开源大模型趋势分析:bge-m3在AI知识库中的核心作用

开源大模型趋势分析:bge-m3在AI知识库中的核心作用 1. 项目概述与核心价值 BAAI/bge-m3是北京智源人工智能研究院推出的多语言通用嵌入模型,作为当前开源领域最强的语义嵌入模型之一,它在多语言理解、长文本处理和异构数据检索方面表现出色…...

Stable-Diffusion-v1-5-archive新手教程:30分钟掌握Prompt/Negative Prompt/Seed协同技巧

Stable-Diffusion-v1-5-archive新手教程:30分钟掌握Prompt/Negative Prompt/Seed协同技巧 你是不是也遇到过这种情况:看到别人用Stable Diffusion生成的图片又美又精致,轮到自己上手,输入同样的描述词,出来的图却总是…...

Stable Yogi Leather-Dress-Collection入门指南:Streamlit宽屏UI响应式布局解析

Stable Yogi Leather-Dress-Collection入门指南:Streamlit宽屏UI响应式布局解析 1. 项目概述 Stable Yogi Leather-Dress-Collection是一款基于Stable Diffusion v1.5和Anything V5动漫底座模型开发的2.5D皮衣穿搭生成工具。它通过Streamlit构建了直观的宽屏交互界…...

Kimi-VL-A3B-Thinking开源大模型价值:相比闭源方案降本70%+数据本地化保障

Kimi-VL-A3B-Thinking开源大模型价值:相比闭源方案降本70%数据本地化保障 1. 模型简介与核心优势 Kimi-VL-A3B-Thinking是一款创新的开源混合专家(MoE)视觉语言模型,在多模态推理领域展现出卓越性能。该模型仅激活2.8B参数的语言…...

5个开源语义模型部署推荐:BAAI/bge-m3免配置镜像一键启动

5个开源语义模型部署推荐:BAAI/bge-m3免配置镜像一键启动 1. 项目简介 BAAI/bge-m3语义相似度分析引擎是一个基于先进多语言嵌入模型的智能文本分析工具。这个镜像封装了北京智源人工智能研究院开发的bge-m3模型,是目前开源领域最强大的语义理解模型之…...

StructBERT情感分析部署案例:边缘设备(Jetson)轻量化适配可行性分析

StructBERT情感分析部署案例:边缘设备(Jetson)轻量化适配可行性分析 1. 引言:当情感分析遇上边缘计算 想象一下,一个智能客服机器人正在处理海量的用户咨询,它需要实时判断每一条消息背后的情绪是愤怒、满…...

Qwen3-0.6B-FP8行业落地:跨境电商商品描述生成+多平台适配格式输出

Qwen3-0.6B-FP8行业落地:跨境电商商品描述生成多平台适配格式输出 1. 引言:当小模型遇上大生意 如果你是做跨境电商的,每天最头疼的事情是什么?我猜很多人会说:写商品描述。 一个爆款产品,要上架到亚马逊…...

EagleEye效果展示:同一张图不同Threshold设置下的检测结果对比图集

EagleEye效果展示:同一张图不同Threshold设置下的检测结果对比图集 1. EagleEye是什么:毫秒级目标检测的视觉新选择 EagleEye不是传统意义上的目标检测模型,而是一套基于达摩院DAMO-YOLO架构、融合TinyNAS自动搜索能力的轻量化视觉引擎。它…...

VibeVoice语音合成快速上手:流式播放+CFG参数调节详细步骤

VibeVoice语音合成快速上手:流式播放CFG参数调节详细步骤 1. 项目简介与核心价值 VibeVoice是微软推出的轻量级实时语音合成系统,基于开源的VibeVoice-Realtime-0.5B模型构建。这个系统最大的特点是能够在300毫秒内开始输出音频,真正实现了…...

WuliArt Qwen-Image Turbo代码实例:基于Qwen-Image-2512的Turbo推理实践

WuliArt Qwen-Image Turbo代码实例:基于Qwen-Image-2512的Turbo推理实践 想不想在个人电脑上,用一张消费级显卡,就能像专业工作室一样“秒出”高清大图?今天要介绍的WuliArt Qwen-Image Turbo,就是这样一个让你梦想成…...

Chord视频分析完整指南:抽帧策略、分辨率限制、显存保护机制全说明

Chord视频分析完整指南:抽帧策略、分辨率限制、显存保护机制全说明 1. 引言:为什么需要本地智能视频分析? 想象一下,你有一段视频,想知道里面发生了什么,或者想找到某个特定的人或物在视频的哪个位置、哪…...

伏羲天气预报气象服务升级:地市级气象台低成本部署AI预报辅助决策系统

伏羲天气预报气象服务升级:地市级气象台低成本部署AI预报辅助决策系统 1. 系统概述与核心价值 伏羲天气预报系统(FuXi)是复旦大学研发的15天全球天气预报级联机器学习系统,基于Nature npj Climate and Atmospheric Science发表的…...

FireRed-OCR Studio快速上手:使用Gradio替代Streamlit构建更轻量Web界面

FireRed-OCR Studio快速上手:使用Gradio替代Streamlit构建更轻量Web界面 1. 为什么选择Gradio重构FireRed-OCR Studio? 如果你用过FireRed-OCR Studio,一定会被它强大的文档解析能力所吸引。它能精准识别文字、还原复杂表格、提取数学公式&…...

Kimi-VL-A3B-Thinking镜像免配置:Chainlit前端自动发现vLLM服务机制

Kimi-VL-A3B-Thinking镜像免配置:Chainlit前端自动发现vLLM服务机制 1. 模型简介 Kimi-VL-A3B-Thinking是一款高效的开源混合专家(MoE)视觉语言模型(VLM),具备以下核心特点: 高效架构&#x…...

Z-Image-Turbo_Sugar脸部Lora惊艳案例:‘薄涂裸粉唇釉’色彩饱和度与唇部纹理细节还原

Z-Image-Turbo_Sugar脸部Lora惊艳案例:‘薄涂裸粉唇釉’色彩饱和度与唇部纹理细节还原 最近在尝试各种AI图像生成模型时,我偶然发现了一个专门针对“Sugar”风格脸部特写的Lora模型——Z-Image-Turbo_Sugar。说实话,一开始我对这种特定风格的…...

Kimi-VL-A3B-Thinking部署教程:Kubernetes集群中多实例水平扩展

Kimi-VL-A3B-Thinking部署教程:Kubernetes集群中多实例水平扩展 1. 模型简介与核心能力 Kimi-VL-A3B-Thinking是一款高效的开源混合专家(MoE)视觉语言模型,专为多模态推理任务设计。该模型仅激活语言解码器中的2.8B参数&#xf…...

通义千问3-4B-Instruct镜像部署:Windows/Mac双平台教程

通义千问3-4B-Instruct镜像部署:Windows/Mac双平台教程 1. 开篇:为什么选择这个模型? 如果你正在寻找一个既小巧又强大的AI模型,能在自己的电脑上流畅运行,那么通义千问3-4B-Instruct可能就是你的理想选择。 这个模…...

HY-Motion 1.0企业应用:智能硬件厂商生成SDK示例动作库(含C++调用)

HY-Motion 1.0企业应用:智能硬件厂商生成SDK示例动作库(含C调用) 想象一下,你是一家智能硬件公司的研发负责人,正在为一款全新的家庭健身镜或AI教练机器人开发核心功能。产品需要能根据用户的语音指令,实时…...

使用VScode开发Java项目,在一个maven工程中,出现src源代码的java文件无法进行自动编译、自动纠错功能的解决方法

也就是VScode编译器代码不进行自动纠察,胡乱写一通代码,代码下面不出现波浪线?!出现原因:其实就是在maven工程中jdk未识别到!无法编译java工程!解决方法:完善pom.xml即可&#xff0c…...

SkyWalking - 指标(Metrics)采集:JVM、OS、HTTP 等内置指标说明

👋 大家好,欢迎来到我的技术博客! 📚 在这里,我会分享学习笔记、实战经验与技术思考,力求用简单的方式讲清楚复杂的问题。 🎯 本文将围绕SkyWalking这个话题展开,希望能为你带来一些…...

内网---> Owns权限滥用

目录 🏆 Owns权限全面扩展解析 🌐 Owns底层原理详解 ⚔️ 内网渗透中的关联与利用场景 🛠️ 详细利用步骤(以Owns组对象为例) ✍️ WriteOwner权限全面扩展解析 🌐 WriteOwner底层原理详解 ⚔️ 内网渗透中的关联与利用场景 🛠️ 详细利用步骤(WriteOwner…...

SkyWalking - 自定义告警指标:基于 Meter 或日志的扩展告警

👋 大家好,欢迎来到我的技术博客! 📚 在这里,我会分享学习笔记、实战经验与技术思考,力求用简单的方式讲清楚复杂的问题。 🎯 本文将围绕SkyWalking这个话题展开,希望能为你带来一些…...