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

c++ lambda 表达式

1. 简介

lambda(匿名函数)是C++11引入的一种函数对象,它允许我们在需要函数的地方创建一个临时的、匿名的函数。lambda表达式表示一个可以执行的代码单元,可以理解为一个未命名的内联函数。Lambda函数可以用于简化代码、提高可读性,并且常与算法STL容器多线程等一起使用。

2. Lambda表达式的语法形式

[capture list] (parameter list) -> return type { function body }

capture list(捕获列表):可以捕获一定范围内的变量,可以为空。用于指定在lambda函数中使用的外部变量。
parameter list(参数列表):函数参数列表,可以为空。
return type(返回类型):指定lambda表达式返回值类型,可以省略,让编译器自动推导返回类型
function body(函数体):定义了lambda表达式执行的代码块。

2.1 简化

原函数:

int add(int a , int b){return a  + b;
}
void printword(){std::cout << "aa" << std::endl;
}

lambda 函数:

//1. 最完整的语法:
//[]()->返回值{};
//捕获列表 函数的参数->函数返回值{函数体};
[](int a , int b)->int{return a + b;} ;
//2. 简化 :返回值可以不用写,编译器可以推断返回值的类型
[](int a , int b){return a + b;};
//3. 简化,如果函数的参数没有,那么()也可以不用那些了。
[]{;};
例如:[]{std::cout << "hello world" << std::endl;};

3. 调用Lambda函数

[]{std::cout << "hello world" << std::endl;};

仅仅是定义了一个函数,这个函数不会被执行
要想调用这个函数,需要使用函数名字()来调用,或者使用函数指针来接收它然后调用。

3.1 函数名字() 调用Lambda函数

1. 无参数,无返回值
[]{std::cout << "hello world" << std::endl;}();
2. 有参数,有返回值
[](int a , int b){return a + b;}(10,20);

3.2 函数指针调用Lambda函数

1. 无参数,无返回值
void(*f)() = []{std::cout << "hello world" << std::endl;
};
f();
2. 有参数,有返回值
int(*fadd)(int,int)  =[](int a , int b){return a  + b;
};
cout <<  fadd(10,20) <<endl;

3.3 auto 调用Lambda函数

```cpp
1. 无参数,无返回值
auto f = []{std::cout << "hello world" << std::endl;
};
f();
2. 有参数,有返回值
auto fadd = [](int a , int b){return a  + b;
};
cout <<  fadd(10,20) <<endl;

4. 捕获列表的使用

lambda表达式需要在函数体中定义,这时如果想访问所处函数中的某个成员(局部变量),那么就需要使用捕获列表了。捕获列表的写法通常有以下几种形式:

形式作用
[a]表示值传递方式捕获变量 a
[=]表示值传递方式捕获所有父作用域的变量(包括this)
[&a]表示引用方式传递捕获变量a
[&]表示引用传递方式捕获所有父作用域的变量(包括this)
[this]表示值传递方式捕获当前的this指针
[=,&a,&b]引用方式捕获 a 和 b , 值传递方式捕获其他所有变量 (这是组合写法)

代码:

#include<iostream>using namespace std;int main(){int a = 20 ;int b = 30;//值传递方式捕获 a 和 b,在lambda 函数体内无法修改a和b的值auto f1 = [a,b]{return a + b;}; cout << f1()  << endl; //引用方式捕获 a 和 b  , 可以在内部修改a 和 b的值auto f2 = [&a,&b]{ a = 40; //这里修改会导致外部的a 也跟着修改。return a + b;};cout << f2()  << endl; //这里打印35cout << "a= "<< a << endl; //再打印一次,a 变成30了return 0 ;
}

4. 特点

匿名性:Lambda函数是匿名的,没有函数名。它的定义和使用都是在需要的地方,无需提前声明。
闭包(Closure):Lambda函数可以捕获外部作用域的变量,包括局部变量、函数参数、全局变量等,并在函数体内使用。捕获方式可通过捕获列表进行指定。捕获的变量可以在函数体内进行读取和修改。
自动推导:Lambda函数的参数类型和返回类型可以通过编译器自动推导,可以省略。如果省略返回类型,则根据函数体中的返回语句自动推导返回类型。
函数对象:Lambda函数实际上是一个函数对象,可以像普通函数一样被调用。可以将Lambda函数作为参数传递给其他函数,也可以存储在容器中。
代码:

#include <iostream>
#include <vector>
#include <algorithm>int main() {std::vector<int> numbers = {1, 2, 3, 4, 5};// Lambda函数作为参数传递给std::for_each算法std::for_each(numbers.begin(), numbers.end(), [](int num) {std::cout << num << " ";});// Lambda函数捕获外部变量,并进行计算int factor = 2;std::transform(numbers.begin(), numbers.end(), numbers.begin(), [factor](int num) {return num * factor;});// Lambda函数作为谓词进行排序std::sort(numbers.begin(), numbers.end(), [](int a, int b) {return a > b;});// 输出结果for (int num : numbers) {std::cout << num << " ";}return 0;
}

std::for_each 算法中,使用Lambda函数作为参数,遍历 numbers 容器并输出每个元素。
std::transform 算法中,使用Lambda函数对 numbers 容器中的每个元素进行乘以 factor 的操作。
std::sort 算法中,使用Lambda函数作为谓词,根据元素的大小进行降序排序。

5. 使用场景

  1. 标准算法:作为标准算法的参数,用于定制算法的行为。例如,使用Lambda函数作为谓词对容器进行筛选、排序等操作
#include <iostream>
#include <vector>
#include <algorithm>int main() {std::vector<int> numbers = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};// 使用Lambda函数作为谓词,筛选出偶数auto isEven = [](int num) {return num % 2 == 0;};std::vector<int> evenNumbers;std::copy_if(numbers.begin(), numbers.end(), std::back_inserter(evenNumbers), isEven);// 输出结果for (int num : evenNumbers) {std::cout << num << " ";}return 0;
}
  1. 回调函数:作为回调函数传递给其他函数,用于处理特定事件或条件。
#include <iostream>
#include <functional>// 模拟事件处理器
void processEvent(int data, std::function<void(int)> callback) {// 处理事件// ...// 调用回调函数callback(data);
}int main() {int eventData = 0;// 使用Lambda函数作为回调函数processEvent(eventData, [](int data) {std::cout << "Event processed with data: " << data << std::endl;});return 0;
}

或者:

#include <iostream>
#include <functional>void performOperation(int a, int b, std::function<void(int)> callback) {int result = a + b;callback(result);
}int main() {int x = 5, y = 3;performOperation(x, y, [](int result) {std::cout << "The result is: " << result << std::endl;});return 0;
}
  1. 多线程编程:作为线程的执行体,方便地捕获外部变量。
#include <iostream>
#include <thread>int main() {int value = 42;// 使用Lambda函数作为线程的执行体std::thread t([&value]() {// 在子线程中使用外部变量std::cout << "Value in thread: " << value << std::endl;});// 等待子线程结束t.join();return 0;
}
  1. 函数对象的临时定义:在需要临时定义函数对象的场景,避免为简单的操作额外定义函数。
#include <iostream>
#include <vector>
#include <algorithm>int main() {std::vector<int> numbers = {3, 1, 4, 1, 5};// 使用Lambda函数作为函数对象std::for_each(numbers.begin(), numbers.end(), [](int num) {std::cout << num << " ";});return 0;
}

相关文章:

c++ lambda 表达式

1. 简介 lambda&#xff08;匿名函数&#xff09;是C11引入的一种函数对象&#xff0c;它允许我们在需要函数的地方创建一个临时的、匿名的函数。lambda表达式表示一个可以执行的代码单元&#xff0c;可以理解为一个未命名的内联函数。Lambda函数可以用于简化代码、提高可读性…...

Go语言入门心法(七): 并发与通道

Go语言入门心法(一): 基础语法 Go语言入门心法(二): 结构体 Go语言入门心法(三): 接口 Go语言入门心法(四): 异常体系 Go语言入门心法(五): 函数 一: go语言并发与通道...

前端组件封装:构建模块化、可维护和可重用的前端应用

前端组件封装&#xff1a;构建模块化、可维护和可重用的前端应用 前端开发领域的快速演进已经将前端应用的规模和复杂性提升到了一个新的水平。在这个背景下&#xff0c;前端组件封装成为了一项关键实践&#xff0c;旨在构建模块化、可维护和可重用的前端应用。在本文中&#…...

GPT绘制流程图咒语

【咒语】下面是我的一篇论文选取部分&#xff0c;为了让读者更好理解&#xff0c;我准备画一张图&#xff0c;请你阅读后为我设计一下这个图应该怎么画&#xff0c;更有说服力&#xff0c;更容易理解 论文片段&#xff1a; 多模态数据融合研究的基础在于有效的数据采集。首先&a…...

【扩散模型从原理到实战】Chapter1 扩散模型简介

文章目录 1.1 扩散模型的原理生成模型扩散过程DDPM的扩散过程前向过程反向过程优化目标 1.2 扩散模型的发展开始扩散&#xff1a;DDPM加速生成&#xff1a;采样器刷新记录&#xff1a;基于CLIP的多模态图像生成引爆网络&#xff1a;基于CLIP的多模态图像生成再次“出圈”&#…...

使用轮廓分数提升时间序列聚类的表现

我们将使用轮廓分数和一些距离指标来执行时间序列聚类实验&#xff0c;并且进行可视化 让我们看看下面的时间序列: 如果沿着y轴移动序列添加随机噪声&#xff0c;并随机化这些序列&#xff0c;那么它们几乎无法分辨&#xff0c;如下图所示-现在很难将时间序列列分组为簇: 上面…...

蔬菜水果生鲜配送团购商城小程序的作用是什么

蔬菜水果是人们生活所需品&#xff0c;从业者众多&#xff0c;无论小摊贩还是超市商场都有不少人每天光临&#xff0c;当然这些只是自然流量&#xff0c;在实际经营中&#xff0c;蔬菜水果商家还是面临着一些难题。 对蔬菜水果商家而言&#xff0c;线下门店是重要的&#xff0…...

金融用户实践|分布式存储支持数据仓库业务系统性能验证

作者&#xff1a;深耕行业的 SmartX 金融团队 闫海涛 估值是指对资产或负债的价值进行评估的过程&#xff0c;这对于投资决策具有重要意义。每个金融公司资管业务人员都期望能够实现实时的业务估值&#xff0c;快速获取最新的数据和指标&#xff0c;从而做出更明智的投资决策。…...

代码随想录二刷 Day41

509. 斐波那契数 这个题简单入门&#xff0c;注意下N小于等于1的情况就可以 class Solution { public:int fib(int n) {if (n < 1) return n; //这句不写的话test能过但是另外的过不了vector<int> result(n 1); //定义存放dp结果的数组&#xff0c;还要定义大小r…...

C++项目实战——基于多设计模式下的同步异步日志系统-⑪-日志器管理类与全局建造者类设计(单例模式)

文章目录 专栏导读日志器建造者类完善单例日志器管理类设计思想单例日志器管理类设计全局建造者类设计日志器类、建造者类整理日志器管理类测试 专栏导读 &#x1f338;作者简介&#xff1a;花想云 &#xff0c;在读本科生一枚&#xff0c;C/C领域新星创作者&#xff0c;新星计…...

Hadoop3教程(十四):MapReduce中的排序

文章目录 &#xff08;99&#xff09;WritableComparable排序什么是排序什么时候需要排序排序有哪些分类如何实现自定义排序 &#xff08;100&#xff09;全排序案例案例需求思路分析实际代码 &#xff08;101&#xff09;二次排序案例&#xff08;102&#xff09; 区内排序案例…...

测试需要写测试用例吗?

如何理解软件的质量 我们都知道&#xff0c;一个软件从无到有要经过需求设计、编码实现、测试验证、部署发布这四个主要环节。 需求来源于用户反馈、市场调研或者商业判断。意指在市场行为中&#xff0c;部分人群存在某些诉求或痛点&#xff0c;只要想办法满足这些人群的诉求…...

Qt 视口和窗口的区别

视口和窗口 绘图设备的物理坐标是基本的坐标系&#xff0c;通过QPainter的平移、旋转等变换可以得到更容易操作的逻辑坐标 为了实现更方便的坐标&#xff0c;QPainter还提供了视口(Viewport)和窗口(Window)坐标系&#xff0c;通过QPainter内部的坐标变换矩阵自动转换为绘图设…...

使用Git将GitHub仓库下载到本地

前记&#xff1a; git svn sourcetree gitee github gitlab gitblit gitbucket gitolite gogs 版本控制 | 仓库管理 ---- 系列工程笔记. Platform&#xff1a;Windows 10 Git version&#xff1a;git version 2.32.0.windows.1 Function&#xff1a;使用Git将GitHub仓库下载…...

前端需要了解的浏览器缓存知识

文章目录 前言为什么需要缓存&#xff1f;DNS缓存缓存读写顺序缓存位置memory cache&#xff08;浏览器本地缓存&#xff09;disk cache&#xff08;硬盘缓存&#xff09;重点&#xff01;&#xff01;&#xff01; 缓存策略 - 强缓存和协商缓存1&#xff09;强缓存ExpiresCach…...

自动驾驶:控制算法概述

自动驾驶&#xff1a;控制算法概述 常见控制算法PID算法LQR算法MPC算法 自动驾驶控制算法横向控制纵向控制 参考文献 常见控制算法 PID算法 PID&#xff08;Proportional-Integral-Derivative&#xff09;控制是一种经典的反馈控制算法&#xff0c;通常用于稳定性和响应速度要…...

【Mysql】Mysql的字符集和比较规则(三)

字符集和比较规则简介 字符集简介 我们知道在计算机中只能以二进制的方式对数据进行存储&#xff0c;那么他们之间是怎样对应并进行转换的&#xff1f;我们需要了解两个概念&#xff1a; 字符范围&#xff1a;我们可以将哪些字符转换成二进制数据&#xff0c;也就是规定好字…...

【SpringCloud-11】SCA-sentinel

sentinel是一个流量控制、熔断降级的组件&#xff0c;可以替换第一代中的hystrix。 hystrix用起来没有那么方便&#xff1a; 1、要在调用方引入hystrix&#xff0c;没有ui界面进行配置&#xff0c;需要在代码中进行配置&#xff0c;侵入了业务代码。 2、还要自己搭建监控平台…...

设计模式:简单工厂模式(C#、JAVA、JavaScript、C++、Python、Go、PHP):

简介&#xff1a; 简单工厂模式&#xff0c;它提供了一个用于创建对象的接口&#xff0c;但具体创建的对象类型可以在运行时决定。这种模式通常用于创建具有共同接口的对象&#xff0c;并且可以根据客户端代码中的参数或配置来选择要创建的具体对象类型。 在简单工厂模式中&am…...

浅谈智能照明控制系统在智慧建筑中的应用

贾丽丽 安科瑞电气股份有限公司 上海嘉定 201801 摘要&#xff1a;新时期&#xff0c;建筑行业发展迅速&#xff0c;在信息化背景下&#xff0c;建筑功能逐渐拓展&#xff0c;呈现了智能化的发展态势。智能建筑更加安全、节能、环保&#xff0c;也符合绿色建筑理念。在建筑智…...

Chapter03-Authentication vulnerabilities

文章目录 1. 身份验证简介1.1 What is authentication1.2 difference between authentication and authorization1.3 身份验证机制失效的原因1.4 身份验证机制失效的影响 2. 基于登录功能的漏洞2.1 密码爆破2.2 用户名枚举2.3 有缺陷的暴力破解防护2.3.1 如果用户登录尝试失败次…...

C++:std::is_convertible

C++标志库中提供is_convertible,可以测试一种类型是否可以转换为另一只类型: template <class From, class To> struct is_convertible; 使用举例: #include <iostream> #include <string>using namespace std;struct A { }; struct B : A { };int main…...

376. Wiggle Subsequence

376. Wiggle Subsequence 代码 class Solution { public:int wiggleMaxLength(vector<int>& nums) {int n nums.size();int res 1;int prediff 0;int curdiff 0;for(int i 0;i < n-1;i){curdiff nums[i1] - nums[i];if( (prediff > 0 && curdif…...

GitHub 趋势日报 (2025年06月08日)

&#x1f4ca; 由 TrendForge 系统生成 | &#x1f310; https://trendforge.devlive.org/ &#x1f310; 本日报中的项目描述已自动翻译为中文 &#x1f4c8; 今日获星趋势图 今日获星趋势图 884 cognee 566 dify 414 HumanSystemOptimization 414 omni-tools 321 note-gen …...

根据万维钢·精英日课6的内容,使用AI(2025)可以参考以下方法:

根据万维钢精英日课6的内容&#xff0c;使用AI&#xff08;2025&#xff09;可以参考以下方法&#xff1a; 四个洞见 模型已经比人聪明&#xff1a;以ChatGPT o3为代表的AI非常强大&#xff0c;能运用高级理论解释道理、引用最新学术论文&#xff0c;生成对顶尖科学家都有用的…...

在QWebEngineView上实现鼠标、触摸等事件捕获的解决方案

这个问题我看其他博主也写了&#xff0c;要么要会员、要么写的乱七八糟。这里我整理一下&#xff0c;把问题说清楚并且给出代码&#xff0c;拿去用就行&#xff0c;照着葫芦画瓢。 问题 在继承QWebEngineView后&#xff0c;重写mousePressEvent或event函数无法捕获鼠标按下事…...

保姆级教程:在无网络无显卡的Windows电脑的vscode本地部署deepseek

文章目录 1 前言2 部署流程2.1 准备工作2.2 Ollama2.2.1 使用有网络的电脑下载Ollama2.2.2 安装Ollama&#xff08;有网络的电脑&#xff09;2.2.3 安装Ollama&#xff08;无网络的电脑&#xff09;2.2.4 安装验证2.2.5 修改大模型安装位置2.2.6 下载Deepseek模型 2.3 将deepse…...

AGain DB和倍数增益的关系

我在设置一款索尼CMOS芯片时&#xff0c;Again增益0db变化为6DB&#xff0c;画面的变化只有2倍DN的增益&#xff0c;比如10变为20。 这与dB和线性增益的关系以及传感器处理流程有关。以下是具体原因分析&#xff1a; 1. dB与线性增益的换算关系 6dB对应的理论线性增益应为&…...

深度学习水论文:mamba+图像增强

&#x1f9c0;当前视觉领域对高效长序列建模需求激增&#xff0c;对Mamba图像增强这方向的研究自然也逐渐火热。原因在于其高效长程建模&#xff0c;以及动态计算优势&#xff0c;在图像质量提升和细节恢复方面有难以替代的作用。 &#x1f9c0;因此短时间内&#xff0c;就有不…...

免费数学几何作图web平台

光锐软件免费数学工具&#xff0c;maths,数学制图&#xff0c;数学作图&#xff0c;几何作图&#xff0c;几何&#xff0c;AR开发,AR教育,增强现实,软件公司,XR,MR,VR,虚拟仿真,虚拟现实,混合现实,教育科技产品,职业模拟培训,高保真VR场景,结构互动课件,元宇宙http://xaglare.c…...