「C/C++」C/C++ Lamada表达式
✨博客主页:何曾参静谧的博客
📌文章专栏:「C/C++」C/C++程序设计
相关术语
Lambda表达式:
是C++11
引入的一种函数对象
,可以方便地创建匿名函数。与传统的函数不同,Lambda表达式可以在定义时直接嵌入代码,无需单独定义函数名称、参数和返回类型等信息。Lambda表达式通常用于需要定义一些简单的回调函数或者函数对象。优点:简洁
、效率高
、更加灵活
。
一、语法格式
//Lambda表达式的语法如下:
[capture-list] (parameter-list) opt -> return-type { function-body }
[捕获列表](参数列表) 函数选项 -> 返回值类型{函数体};//示例代码:
auto ret = [](int a,int b) -> int {return a + b;
};
1.1、捕获列表[capture-list]
[]
- 不捕捉任何变量[&]
- 捕获外部作用域中所有变量,并作为引用在函数体内使用 (按引用捕获
)[=]
- 捕获外部作用域中所有变量,并作为副本在函数体内使用 (按值捕获
)
– 拷贝的副本在匿名函数体内部是只读的
[=, &foo]
- 按值捕获外部作用域中所有变量,并按照引用捕获外部变量 foo[bar]
- 按值捕获 bar 变量,同时不捕获其他变量[&bar]
- 按引用捕获 bar 变量,同时不捕获其他变量[this]
- 捕获当前类中的 this 指针
– 让 lambda 表达式拥有和当前类成员函数同样的访问权限
– 如果已经使用了 & 或者 =, 默认添加此选项
1.2、参数列表(parameter-list)
其中,parameter-list可以包含以下内容:
空参数列表:
(),表示没有任何参数。普通参数列表:
(int a, double b)。可变参数列表:
(int a, double b, …),表示可以接受任意数量的参数。
//例如,以下Lambda表达式将接受两个整数作为参数,并返回它们的和:
auto lambda = [](int a, int b) -> int { return a + b; };
1.3、 函数选项(opt)可省略
mutable:
可以修改按值传递进来的拷贝(注意是能修改拷贝,而不是值本身)一般和[=]一起
exception:
指定函数抛出的异常,如抛出整数类型的异常,可以使用 throw ();
1.4、返回类型 -> return-type
标识函数返回值的类型,当返回值为 void,或者函数体中只有一处 return 的地方(此时编译器可以自动推断出返回值类型)时,这部分可以省略
//例如,以下Lambda表达式将接受两个整数作为参数,并返回它们的和:
auto lambda = [](int a, int b) { return a + b; };
1.5、函数体 { function-body }
函数的实现,这部分
不能省略
,但函数体可以为空
,可以包含任意数量的语句
。
//例如,以下Lambda表达式将按值捕获变量x和y,并返回它们的和:
int x = 1, y = 2;
auto lambda = [=]() -> int {int sum = x + y;return sum;
};
二、使用Lambda表达式
Lambda表达式可以像普通函数一样使用,可以赋值给函数对象、作为函数参数或返回值等。下面是一些使用Lambda表达式的示例:
2.1、赋值给函数对象
可以将Lambda表达式赋值给函数对象,以便在其他地方使用。
#include <iostream>
#include <functional>int main()
{std::function<int(int, int)> add = [](int a, int b) -> int {return a + b;};std::cout << add(1, 2) << std::endl; // 输出3return 0;
}
2.2、作为函数参数
可以将Lambda表达式作为函数参数传递,用于定义回调函数等。
#include <iostream>
#include <vector>
#include <algorithm>int main()
{std::vector<int> vec = {1, 2, 3, 4, 5};// 使用Lambda表达式定义判断是否为偶数的函数对象auto is_even = [](int n) -> bool {return n % 2 == 0;}; // 注意这里要添加分号// 使用std::count_if算法统计偶数个数int count = std::count_if(vec.begin(), vec.end(), is_even);std::cout << count << std::endl; // 输出2return 0;
}
2.3、作为返回值
可以将Lambda表达式作为函数的返回值,用于动态生成函数对象。
#include <iostream>
#include <functional>std::function<int(int, int)> create_adder(int n){// 使用Lambda表达式动态生成函数对象return [n](int x, int y) -> int {return n + x + y;};
}int main(){auto adder = create_adder(10);std::cout << adder(1, 2) << std::endl; // 输出13return 0;
}
2.4、匿名函数
//这个匿名函数只是被定义,不会被调用。
[](){cout << "这是一个Lamada匿名函数";
};
//匿名函数定义+调用。
[](){cout << "这是一个Lamada匿名函数";
}();
// 匿名函数的定义+调用:
int ret = [](int a) -> int
{return a+1;
}(100); // 100是传递给匿名函数的参数
// 在匿名函数外部定义变量
int a=1, b=2, c=3;
// 调用匿名函数
[](){// 打印外部变量的值cout << "a:" << a << ", b: " << b << ", c:" << c; // error, 不能使用任何外部变量
};[&](){cout << "使用引用的方式传递数据: ";cout << "a+1:" << a++ << ", b+c= " << b+c;
}();// 值拷贝的方式使用外部数据
[=](int m, int n)mutable{cout << "使用拷贝的方式传递数据: ";// 拷贝的外部数据在函数体内部是只读的, 如果不添加 mutable 关键字是不能修改这些只读数据的值的// 添加 mutable 允许修改的数据是拷贝到函数内部的副本, 对外部数据没有影响cout << "a+1:" << a++ << ", b+c= " << b+c;cout << "m+1: " << ++m << ", n: " << n;
}(1, 2);
相关文章:

「C/C++」C/C++ Lamada表达式
✨博客主页:何曾参静谧的博客 📌文章专栏:「C/C」C/C程序设计 相关术语 Lambda表达式:是C11引入的一种函数对象,可以方便地创建匿名函数。与传统的函数不同,Lambda表达式可以在定义时直接嵌入代码ÿ…...

bug(Tomcat):StandardContext.startInternal 由于之前的错误,Context[/day01]启动失败
引出 项目启动失败,一个困扰了一上午的bug 报错信息 org.apache.catalina.core.StandardContext.startInternal 一个或多个筛选器启动失败。完整的详细信息将在相应的容器日志文件中找到 org.apache.catalina.core.StandardContext.startInternal 由于之前的错误…...

Java性能权威指南-总结6
Java性能权威指南-总结6 垃圾收集入门垃圾收集概述GC算法选择GC算法 垃圾收集入门 垃圾收集概述 GC算法 JVM提供了以下四种不同的垃圾收集算法: Serial垃圾收集器 Serial垃圾收集器是四种垃圾收集器中最简单的一种。如果应用运行在Client型虚拟机(Windows平台上的32位JVM或…...
群的定义及性质
群的定义 设 < G , ⋅ > \left<G,\cdot\right> ⟨G,⋅⟩为独异点,若 G G G中每个元素关于 ⋅ \cdot ⋅都是可逆的,则称 < G , ⋅ > \left<G,\cdot\right> ⟨G,⋅⟩为群 由于群中结合律成立,每个元素的逆元是唯一的 …...

mac电脑git clone项目时报错证书过期和权限被拒绝
mac电脑使用git clone命令克隆项目时,一开始一直提示证书过期 SSL certificate problem: certificate has expired 执行以下代码关掉验证后,解决了这个问题 找到git目录 Git\git-cmd输入命令跳转到bin目录,cd bin输入命令运行git.exe执行关…...

【AIGC】Photoshop AI Beta版本安装使用(永久免费)
AIGC 大爆发 Adobe近日宣布,Photoshop(测试版)应用程序发布了生成式AI绘图,这是世界上第一个创意和设计工作流程的副驾驶,为用户提供了一种神奇的新工作方式。生成式AI绘图由Adobe Firefly提供支持,Adobe的…...

01 云原生生态系统解读
云计算的技术革命 互联网时代的历程 云计算到底是什么 云计算历程 云平台的优缺点 优势 稳定性:云平台大量资源,分布式集群部署,保障服务永不宕机,几个9弹性扩展:按需索取,一键秒级开通需要的资源安全性&…...
Java——Java易错选择题复习(2)(计算机网络)
1. 下面关于源端口地址和目标端口地址的描述中,正确的是( ) A. 在TCP/UDP传输段中,源端口地址和目的端口地址是不能相同的 B. 在TCP/UDP传输段中,源端口地址和目的端口地址必须是相同的 C. 在TCP/UDP传输段中ÿ…...
【HTML5系列教程】
《HTML5系列教程》目录大纲: 介绍 内容包括HTML简介、服务器的概念、B/S、C/S软件架构、前端与后端的开发内容、HTML发展历程、浏览器内核介绍、Web标准、WebStorm工具的使用、WebStorm常用快捷键、HTML常用标签 如:文本标签(span)、排版标签(div/p/h…...

二、电压源、电流源、受控源
点我回到目录 目录 理想电压源 理想电流源 受控源 电流源做功问题 电压源做功问题 理想电压源 •定义:两端电压保持定值或一定的时间函数,且电压值与流过它的电流i无关 •特点:理想电压源两端的电压由本身决定,与外电路无关…...

骨传导是哪个意思,推荐几款性能优的骨传导耳机
骨传导耳机是通过头部骨迷路传递声音,而不是直接通过耳膜的振动来传递声音。与传统的入耳式耳机相比,骨传导耳机不会堵耳朵,在跑步、骑车等运动时可以更好的接收外界环境音,保护听力,提升安全性。此外,骨…...

利用Taro打造灵活的移动App架构
最近公司的一些项目需要跨端框架,技术老大选了Taro,实践了一段时间下来,愈发觉得Taro是个好东西,所以在本篇文章中稍微介绍下。 什么是Taro? Taro(或称为Taro框架)是一种用于构建跨平台应用程…...

(转载)基于模拟退火算法的TSP问题求解(matlab实现)
1 理论基础 1.1 模拟退火算法基本原理 模拟退火(simulated annealing,SA)算法的思想最早是由Metropolis等提出的。其出发点是基于物理中固体物质的退火过程与一般的组合优化问题之间的相似性。模拟退火法是一种通用的优化算法,其物理退火过程由以下三部分组成&am…...
splitpcap 使用说明
背景 当PCAP原始文件特别巨大的时候,整个文件直接载入内存是相当耗时的,于是一个简单的想法是将大的PCAP切分成若干小PCAP。对于这个任务,现有工具splitcap是可以完成的。无论是按照主机对、还是按照五元组信息切分,splitcap都会…...
配置docker阿里云镜像加速
默认情况下docker安装镜像文件是从docker官方的镜像中心下载:https://hub.docker.com/ , 有时速度慢,可以通过配置docker阿里云镜像来加速,配置后,就从国内阿里云下载。 注册阿里云用户,登录->工作台-&g…...

《消息队列高手课》课程学习笔记(八)
如何实现高性能的异步网络传输? **异步与同步模型最大的区别是,同步模型会阻塞线程等待资源,而异步模型不会阻塞线程,它是等资源准备好后,再通知业务代码来完成后续的资源处理逻辑。**这种异步设计的方法,…...

DC电源模块在工业自动化的应用
BOSHIDA DC电源模块在工业自动化的应用 随着自动化技术的不断发展,DC电源模块已成为工业控制系统中不可或缺的一个组成部分。在许多自动化系统中,如机器人、控制器、PLC等,都需要使用到直流电源模块来提供稳定可靠的电源,以确保系…...
Java容器-集合
目录 1.Java容器概述 2.集合框架 3.Collection接口中的方法使用 4.iterator() 5.List接口 2.ArrayList、LinkedList、Vector相同点 3.不同点 1.ArrayList 2.LinkedList 3.Vector 4.Vector源码分析 5.ArrayList源码分析 6.LinkedList源码分析 6.List中的常用方法 …...

总结890
学习目标: 月目标:6月(线性代数强化9讲2遍,背诵15篇短文,考研核心词过三遍) 周目标:线性代数强化3讲,英语背3篇文章并回诵,检测 每日必复习(5分钟ÿ…...

2023年5月青少年机器人技术等级考试理论综合试卷(二级)
青少年机器人技术等级考试理论综合试卷(二级)2023.6 分数: 100 题数: 45 一、 单选题(共 30 题, 共 60 分) 1.下图中的凸轮机构使用了摆动型从动件的是? ( ) A.a B.b C.c D.d 试题类…...
java 实现excel文件转pdf | 无水印 | 无限制
文章目录 目录 文章目录 前言 1.项目远程仓库配置 2.pom文件引入相关依赖 3.代码破解 二、Excel转PDF 1.代码实现 2.Aspose.License.xml 授权文件 总结 前言 java处理excel转pdf一直没找到什么好用的免费jar包工具,自己手写的难度,恐怕高级程序员花费一年的事件,也…...

【第二十一章 SDIO接口(SDIO)】
第二十一章 SDIO接口 目录 第二十一章 SDIO接口(SDIO) 1 SDIO 主要功能 2 SDIO 总线拓扑 3 SDIO 功能描述 3.1 SDIO 适配器 3.2 SDIOAHB 接口 4 卡功能描述 4.1 卡识别模式 4.2 卡复位 4.3 操作电压范围确认 4.4 卡识别过程 4.5 写数据块 4.6 读数据块 4.7 数据流…...

什么是库存周转?如何用进销存系统提高库存周转率?
你可能听说过这样一句话: “利润不是赚出来的,是管出来的。” 尤其是在制造业、批发零售、电商这类“货堆成山”的行业,很多企业看着销售不错,账上却没钱、利润也不见了,一翻库存才发现: 一堆卖不动的旧货…...

(二)原型模式
原型的功能是将一个已经存在的对象作为源目标,其余对象都是通过这个源目标创建。发挥复制的作用就是原型模式的核心思想。 一、源型模式的定义 原型模式是指第二次创建对象可以通过复制已经存在的原型对象来实现,忽略对象创建过程中的其它细节。 📌 核心特点: 避免重复初…...

ETLCloud可能遇到的问题有哪些?常见坑位解析
数据集成平台ETLCloud,主要用于支持数据的抽取(Extract)、转换(Transform)和加载(Load)过程。提供了一个简洁直观的界面,以便用户可以在不同的数据源之间轻松地进行数据迁移和转换。…...

Springcloud:Eureka 高可用集群搭建实战(服务注册与发现的底层原理与避坑指南)
引言:为什么 Eureka 依然是存量系统的核心? 尽管 Nacos 等新注册中心崛起,但金融、电力等保守行业仍有大量系统运行在 Eureka 上。理解其高可用设计与自我保护机制,是保障分布式系统稳定的必修课。本文将手把手带你搭建生产级 Eur…...
Caliper 配置文件解析:config.yaml
Caliper 是一个区块链性能基准测试工具,用于评估不同区块链平台的性能。下面我将详细解释你提供的 fisco-bcos.json 文件结构,并说明它与 config.yaml 文件的关系。 fisco-bcos.json 文件解析 这个文件是针对 FISCO-BCOS 区块链网络的 Caliper 配置文件,主要包含以下几个部…...

vue3+vite项目中使用.env文件环境变量方法
vue3vite项目中使用.env文件环境变量方法 .env文件作用命名规则常用的配置项示例使用方法注意事项在vite.config.js文件中读取环境变量方法 .env文件作用 .env 文件用于定义环境变量,这些变量可以在项目中通过 import.meta.env 进行访问。Vite 会自动加载这些环境变…...

SAP学习笔记 - 开发26 - 前端Fiori开发 OData V2 和 V4 的差异 (Deepseek整理)
上一章用到了V2 的概念,其实 Fiori当中还有 V4,咱们这一章来总结一下 V2 和 V4。 SAP学习笔记 - 开发25 - 前端Fiori开发 Remote OData Service(使用远端Odata服务),代理中间件(ui5-middleware-simpleproxy)-CSDN博客…...

20个超级好用的 CSS 动画库
分享 20 个最佳 CSS 动画库。 它们中的大多数将生成纯 CSS 代码,而不需要任何外部库。 1.Animate.css 一个开箱即用型的跨浏览器动画库,可供你在项目中使用。 2.Magic Animations CSS3 一组简单的动画,可以包含在你的网页或应用项目中。 3.An…...