C/C++基础知识复习(30)
1) 什么是 C++ 中的 Lambda 表达式?它的作用是什么?
Lambda 表达式:
在 C++ 中,Lambda 表达式是一种可以定义匿名函数的机制,可以在代码中快速创建一个内联的函数对象,而不需要显式地定义一个函数。Lambda 表达式通常用于简化代码,尤其是当需要传递一个简单的函数给 STL 算法或作为回调时,十分方便。
Lambda 表达式的基本语法:
[捕获列表](参数列表) -> 返回类型 { // 函数体 };
- 捕获列表 (
[]
):指定外部变量如何在 Lambda 中使用,捕获外部作用域中的变量。 - 参数列表:指定 Lambda 函数的参数(可选)。
- 返回类型:指定 Lambda 表达式的返回类型(可选,通常会自动推断)。
- 函数体:Lambda 的实际代码。
Lambda 表达式的作用:
- 简化函数对象的定义:Lambda 可以用于定义短小的函数,而不需要为它单独定义一个命名的函数或类,尤其是在 STL 算法中常见。
- 提高代码可读性:Lambda 表达式通常用来代替简单的函数对象或临时函数,代码更加简洁和直观。
- 闭包特性:Lambda 表达式可以捕获外部作用域中的变量,形成闭包,方便将外部状态封装到函数中。
Lambda 表达式的示例:
#include <iostream>
#include <vector>
#include <algorithm>
int main() {
std::vector<int> vec = {1, 2, 3, 4, 5}; // 使用 Lambda 表达式打印 vector 中的每个元素 std::for_each(vec.begin(), vec.end(), [](int x) { std::cout << x << " "; }); std::cout << std::endl; // Lambda 表达式可以捕获外部变量
int factor = 2;
std::for_each(vec.begin(), vec.end(), [factor](int& x) { x *= factor; });
// 输出修改后的 vector
std::for_each(vec.begin(), vec.end(), [](int x) { std::cout << x << " "; });
std::cout << std::endl; return 0; }
2) Lambda 表达式可以捕获哪些类型的变量?有哪些捕获方式?
捕获外部变量:
Lambda 表达式可以从其外部作用域捕获变量。捕获的变量可以在 Lambda 内部使用,就像函数的参数一样。捕获的方式分为按值捕获、按引用捕获等。
捕获方式:
-
按值捕获(Value Capture):
捕获外部变量的副本,Lambda 内部使用的是副本,而不是原始变量。如果外部变量的值发生变化,Lambda 内部的副本不会受到影响。
int x = 10; auto lambda = [x]() { std::cout << x << std::endl; }; // 按值捕获 x lambda(); // 输出 10 x = 20; lambda(); // 依然输出 10(捕获的是副本)
-
按引用捕获(Reference Capture):
捕获外部变量的引用,Lambda 内部使用的是外部变量的原始引用。如果外部变量的值发生变化,Lambda 内部捕获的引用会反映这些变化。
int x = 10; auto lambda = [&x]() { std::cout << x << std::endl; }; // 按引用捕获 x lambda(); // 输出 10 x = 20; lambda(); // 输出 20(捕获的是引用,修改了 x 的值)
-
捕获所有外部变量(按值或按引用捕获):
- 按值捕获所有变量:
[=]
捕获外部作用域中的所有变量的副本。 - 按引用捕获所有变量:
[&]
捕获外部作用域中的所有变量的引用。
int a = 5, b = 10; auto lambda1 = [=]() { std::cout << a << " " << b << std::endl; }; // 按值捕获 auto lambda2 = [&]() { std::cout << a << " " << b << std::endl; }; // 按引用捕获 a = 20; b = 30; lambda1(); // 输出 5 10(按值捕获,捕获的是副本) lambda2(); // 输出 20 30(按引用捕获,输出的是修改后的值)
- 按值捕获所有变量:
-
混合捕获:
Lambda 表达式还允许你同时按值和按引用捕获不同的变量。你可以在捕获列表中显式指定每个变量的捕获方式。
int x = 10, y = 20; auto lambda = [x, &y]() { std::cout << "x: " << x << ", y: " << y << std::endl; }; lambda(); // 输出 x: 10, y: 20 x = 30; y = 40; lambda(); // 输出 x: 10, y: 40(x 被按值捕获,y 被按引用捕获)
-
捕获
this
指针:对于成员函数中的 Lambda 表达式,可以捕获
this
指针,这样可以访问类的成员。class MyClass {public: int a = 10; void show() {auto lambda = [this]() {std::cout << a << std::endl; }; lambda(); // 输出 10 } }; MyClass obj; obj.show();
其他捕获方式:
-
无捕获:如果 Lambda 不需要访问外部变量,可以使用空的捕获列表
[]
。auto lambda = []() { std::cout << "No capture" << std::endl; }; lambda(); // 输出 "No capture"
-
mutable
关键字:如果使用按值捕获,Lambda 默认是不可修改捕获的变量。如果需要修改捕获的副本,可以使用mutable
关键字。auto lambda = [x]() mutable { x = 100; std::cout << x << std::endl; }; lambda(); // 输出 100(修改了捕获的副本)
总结
- Lambda 表达式 是一种快速创建匿名函数的方式,用于简化代码和提高可读性。
- Lambda 可以捕获外部作用域中的变量,并且有不同的捕获方式:按值捕获、按引用捕获、捕获所有变量(按值或按引用),以及混合捕获。
- 捕获列表
[=]
和[&]
用来指定捕获方式,mutable
可以让 Lambda 修改捕获的副本。
相关文章:
C/C++基础知识复习(30)
1) 什么是 C 中的 Lambda 表达式?它的作用是什么? Lambda 表达式: 在 C 中,Lambda 表达式是一种可以定义匿名函数的机制,可以在代码中快速创建一个内联的函数对象,而不需要显式地定义一个函数。Lambda 表…...

【NLP 1、人工智能与NLP简介】
人人都不看好你,可偏偏你最争气 —— 24.11.26 一、AI和NLP的基本介绍 1.人工智能发展流程 弱人工智能 ——> 强人工智能 ——> 超人工智能 ① 弱人工智能 人工智能算法只能在限定领域解决特定的问题 eg:特定场景下的文本分类、垂直领域下的对…...

网络安全事件管理
一、背景 信息化技术的迅速发展已经极大地改变了人们的生活,网络安全威胁也日益多元化和复杂化。传统的网络安全防护手段难以应对当前繁杂的网络安全问题,构建主动防御的安全整体解决方案将更有利于防范未知的网络安全威胁。 国内外的安全事件在不断增…...
Swagger记录一次生成失败
最近在接入Swagger的时候遇到一个问题,就是Swagger UI可以使用的,但是/v3/docs 这个接口的json返回的base64类型的json,并不是纯json,后来检查之后是因为springboot3里面配置了json压缩。 Beanpublic HttpMessageConverters cusHt…...
Go 语言常用工具方法总结
在 Go 语言开发中,常常需要进行一些常见的类型转换、字符串处理、时间处理等操作。本文将总结一些常用的工具方法,帮助大家提高编码效率,并提供必要的代码解释和注意事项(go新人浅浅记录一下,以后来翻看🤣&…...

ThingsBoard规则链节点:GCP Pub/Sub 节点详解
目录 引言 1. GCP Pub/Sub 节点简介 2. 节点配置 2.1 基本配置示例 3. 使用场景 3.1 数据传输 3.2 数据分析 3.3 事件通知 3.4 任务调度 4. 实际项目中的应用 4.1 项目背景 4.2 项目需求 4.3 实现步骤 5. 总结 引言 ThingsBoard 是一个开源的物联网平台࿰…...

【Linux】select,poll和epoll
select,poll,epoll都是IO多路复用的机制。I/O多路复用就通过一种机制,可以监视多个描述符fd,一旦某个描述符就绪(一般是读就绪或者写就绪),系统会通知有I/O事件发生了(不能定位是哪一个)。但sel…...

Qt程序发布及打包成exe安装包
参考:Qt之程序发布以及打包成exe安装包 目录 一、简述 Qt 项目开发完成之后,需要打包发布程序,而因为用户电脑上没有 Qt 配置环境,所以需要将 release 生成的 exe 文件和所依赖的 dll 文件复制到一个文件夹中,然后再用 Inno Setup 打包工具打包成一个 exe 安装包,就可以…...

python怎样运行js语句
1. 安装 pip install PyExecJS # 需要注意, 包的名称:PyExecJS 2. 简单使用 import execjs execjs.eval("new Date") 返回值为: 2018-04-04T12:53:17.759Z execjs.eval("Date.now()") 返回值为:152284700108…...

汽车渲染领域:Blender 和 UE5 哪款更适用?两者区别?
在汽车渲染领域,选择合适的工具对于实现高质量的视觉效果至关重要。Blender和UE5(Unreal Engine 5)作为两大主流3D软件,各自在渲染动画方面有着显著的差异。本文将从核心定位与用途、工作流程、渲染技术和灵活性、后期处理与合成四…...
JAVA实现将PDF转换成word文档
POM.xml <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.apache.org/POM/4.0.…...

前端-Git
一.基本概念 Git版本控制系统时一个分布式系统,是用来保存工程源代码历史状态的命令行工具 简单来说Git的作用就是版本管理工具。 Git的应用场景:多人开发管理代码;异地开发,版本管理,版本回滚。 Git 的三个区域&a…...
如何分析Windows防火墙日志
Windows防火墙,也被称为Windows Defender Firewall,是一种内置的安全功能,可以主动监控和分析运行Windows操作系统的计算机上通过Windows防火墙的网络流量,主要目的是作为计算机和互联网或其他网络之间的屏障,使管理员…...

工作坊报名|使用 TEN 与 Azure,探索你的多模态交互新场景
GPT-4o Realtime API 发布,语音 AI 技术正在进入一场新的爆发。语音AI技术的实时语音和视觉互动能力将为我们带来更多全新创意和应用场景。 实时音频交互: 允许应用程序实时接收并响应语音和文本输入。自然语音生成: 减少 AI 技术生成的语音…...
学习笔记041——Elastic Search的学习与使用以及SpringBoot整合
文章目录 1、Elastic Search介绍1.1、ES 的数据结构1.2、ES 为什么查询快1.3、CRUD 2、Spring Boot 整合 ES 1、Elastic Search介绍 Elasticsearch是一个分布式的、基于RESTful API的搜索和分析引擎,广泛用于大规模数据存储和快速检索。它最初由Shay Banon于20…...
R安装rgdal报错 解决办法
尝试了网上很多办法,不知道哪一步解决了,记录一下所有步骤: 1. 尝试github安装 options(repos c(CRAN "https://mirrors.tuna.tsinghua.edu.cn/CRAN/"))install.packages("devtools")library(devtools)devtools::in…...
【智能制造-46】人机工程(工厂自动化)
工作空间设计 设备布局规划 根据人体测量学数据,合理安排自动化设备、生产线和工作区域的布局。例如,考虑工人的操作空间和活动范围,确保他们能够舒适地接近和操作设备。在汽车装配车间,机器人和工人的工作区域应划分明确&#…...

C#笔记(5)
一、winform项目与窗体控件 1、部分类的使用 好处:让自动生成的代码后置,我们编写程序的代码显得更加简洁 特点:在最后编译的时候,仍然编译成一个窗体类。 窗体和控件的基本使用 3、Event事件(委托--》事件&#…...
【软件国产化】| Windows和Linux下文件名后缀是否区分大小写
今天在开发过程中遇到了个软件在Linux系统和Windows系统下功能表现不一致的bug,具体表现为: 插入一张图片(A文件夹中的001.jpg),然后使用“图片替换”功能,用B文件夹中的图片(B文件夹中的001.JP…...
讨论JAVA、JVM与Spring
Q1: 作为一个JAVA开发人员,对于jvm肯定不陌生,但很多人对它不陌生也仅止于概念上,而且对概念也是模糊不清的,但jvm实际是java程序运行在其中的实际存在的环境,对它的理解应该要是具象化的。 我们还是从一项技术产生的…...

SpringBoot-17-MyBatis动态SQL标签之常用标签
文章目录 1 代码1.1 实体User.java1.2 接口UserMapper.java1.3 映射UserMapper.xml1.3.1 标签if1.3.2 标签if和where1.3.3 标签choose和when和otherwise1.4 UserController.java2 常用动态SQL标签2.1 标签set2.1.1 UserMapper.java2.1.2 UserMapper.xml2.1.3 UserController.ja…...
Python爬虫实战:研究MechanicalSoup库相关技术
一、MechanicalSoup 库概述 1.1 库简介 MechanicalSoup 是一个 Python 库,专为自动化交互网站而设计。它结合了 requests 的 HTTP 请求能力和 BeautifulSoup 的 HTML 解析能力,提供了直观的 API,让我们可以像人类用户一样浏览网页、填写表单和提交请求。 1.2 主要功能特点…...

TDengine 快速体验(Docker 镜像方式)
简介 TDengine 可以通过安装包、Docker 镜像 及云服务快速体验 TDengine 的功能,本节首先介绍如何通过 Docker 快速体验 TDengine,然后介绍如何在 Docker 环境下体验 TDengine 的写入和查询功能。如果你不熟悉 Docker,请使用 安装包的方式快…...
ubuntu搭建nfs服务centos挂载访问
在Ubuntu上设置NFS服务器 在Ubuntu上,你可以使用apt包管理器来安装NFS服务器。打开终端并运行: sudo apt update sudo apt install nfs-kernel-server创建共享目录 创建一个目录用于共享,例如/shared: sudo mkdir /shared sud…...
服务器硬防的应用场景都有哪些?
服务器硬防是指一种通过硬件设备层面的安全措施来防御服务器系统受到网络攻击的方式,避免服务器受到各种恶意攻击和网络威胁,那么,服务器硬防通常都会应用在哪些场景当中呢? 硬防服务器中一般会配备入侵检测系统和预防系统&#x…...
【AI学习】三、AI算法中的向量
在人工智能(AI)算法中,向量(Vector)是一种将现实世界中的数据(如图像、文本、音频等)转化为计算机可处理的数值型特征表示的工具。它是连接人类认知(如语义、视觉特征)与…...
Spring Boot面试题精选汇总
🤟致敬读者 🟩感谢阅读🟦笑口常开🟪生日快乐⬛早点睡觉 📘博主相关 🟧博主信息🟨博客首页🟫专栏推荐🟥活动信息 文章目录 Spring Boot面试题精选汇总⚙️ **一、核心概…...

BCS 2025|百度副总裁陈洋:智能体在安全领域的应用实践
6月5日,2025全球数字经济大会数字安全主论坛暨北京网络安全大会在国家会议中心隆重开幕。百度副总裁陈洋受邀出席,并作《智能体在安全领域的应用实践》主题演讲,分享了在智能体在安全领域的突破性实践。他指出,百度通过将安全能力…...
实现弹窗随键盘上移居中
实现弹窗随键盘上移的核心思路 在Android中,可以通过监听键盘的显示和隐藏事件,动态调整弹窗的位置。关键点在于获取键盘高度,并计算剩余屏幕空间以重新定位弹窗。 // 在Activity或Fragment中设置键盘监听 val rootView findViewById<V…...

uniapp 开发ios, xcode 提交app store connect 和 testflight内测
uniapp 中配置 配置manifest 文档:manifest.json 应用配置 | uni-app官网 hbuilderx中本地打包 下载IOS最新SDK 开发环境 | uni小程序SDK hbulderx 版本号:4.66 对应的sdk版本 4.66 两者必须一致 本地打包的资源导入到SDK 导入资源 | uni小程序SDK …...