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

C/C++基础知识复习(30)

1) 什么是 C++ 中的 Lambda 表达式?它的作用是什么?

Lambda 表达式:

在 C++ 中,Lambda 表达式是一种可以定义匿名函数的机制,可以在代码中快速创建一个内联的函数对象,而不需要显式地定义一个函数。Lambda 表达式通常用于简化代码,尤其是当需要传递一个简单的函数给 STL 算法或作为回调时,十分方便。

Lambda 表达式的基本语法:

[捕获列表](参数列表) -> 返回类型 { // 函数体 };
  • 捕获列表 ([]):指定外部变量如何在 Lambda 中使用,捕获外部作用域中的变量。
  • 参数列表:指定 Lambda 函数的参数(可选)。
  • 返回类型:指定 Lambda 表达式的返回类型(可选,通常会自动推断)。
  • 函数体:Lambda 的实际代码。
Lambda 表达式的作用:
  1. 简化函数对象的定义:Lambda 可以用于定义短小的函数,而不需要为它单独定义一个命名的函数或类,尤其是在 STL 算法中常见。
  2. 提高代码可读性:Lambda 表达式通常用来代替简单的函数对象或临时函数,代码更加简洁和直观。
  3. 闭包特性: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 内部使用,就像函数的参数一样。捕获的方式分为按值捕获按引用捕获等。

捕获方式:
  1. 按值捕获(Value Capture)

    捕获外部变量的副本,Lambda 内部使用的是副本,而不是原始变量。如果外部变量的值发生变化,Lambda 内部的副本不会受到影响。

    int x = 10; 
    auto lambda = [x]() {
    std::cout << x << std::endl; }; // 按值捕获 x lambda(); // 输出 10 
    x = 20; 
    lambda(); // 依然输出 10(捕获的是副本)
  2. 按引用捕获(Reference Capture)

    捕获外部变量的引用,Lambda 内部使用的是外部变量的原始引用。如果外部变量的值发生变化,Lambda 内部捕获的引用会反映这些变化。

    int x = 10; 
    auto lambda = [&x]() { 
    std::cout << x << std::endl; }; // 按引用捕获 x lambda(); // 输出 10 
    x = 20; lambda(); // 输出 20(捕获的是引用,修改了 x 的值)
  3. 捕获所有外部变量(按值或按引用捕获)

    • 按值捕获所有变量[=] 捕获外部作用域中的所有变量的副本。
    • 按引用捕获所有变量[&] 捕获外部作用域中的所有变量的引用。
    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(按引用捕获,输出的是修改后的值)
  4. 混合捕获

    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 被按引用捕获)
  5. 捕获 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 表达式&#xff1f;它的作用是什么&#xff1f; Lambda 表达式&#xff1a; 在 C 中&#xff0c;Lambda 表达式是一种可以定义匿名函数的机制&#xff0c;可以在代码中快速创建一个内联的函数对象&#xff0c;而不需要显式地定义一个函数。Lambda 表…...

【NLP 1、人工智能与NLP简介】

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

网络安全事件管理

一、背景 信息化技术的迅速发展已经极大地改变了人们的生活&#xff0c;网络安全威胁也日益多元化和复杂化。传统的网络安全防护手段难以应对当前繁杂的网络安全问题&#xff0c;构建主动防御的安全整体解决方案将更有利于防范未知的网络安全威胁。 国内外的安全事件在不断增…...

Swagger记录一次生成失败

最近在接入Swagger的时候遇到一个问题&#xff0c;就是Swagger UI可以使用的&#xff0c;但是/v3/docs 这个接口的json返回的base64类型的json&#xff0c;并不是纯json&#xff0c;后来检查之后是因为springboot3里面配置了json压缩。 Beanpublic HttpMessageConverters cusHt…...

Go 语言常用工具方法总结

在 Go 语言开发中&#xff0c;常常需要进行一些常见的类型转换、字符串处理、时间处理等操作。本文将总结一些常用的工具方法&#xff0c;帮助大家提高编码效率&#xff0c;并提供必要的代码解释和注意事项&#xff08;go新人浅浅记录一下&#xff0c;以后来翻看&#x1f923;&…...

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 是一个开源的物联网平台&#xff0…...

【Linux】select,poll和epoll

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

Qt程序发布及打包成exe安装包

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

python怎样运行js语句

1. 安装 pip install PyExecJS # 需要注意&#xff0c; 包的名称&#xff1a;PyExecJS 2. 简单使用 import execjs execjs.eval("new Date") 返回值为&#xff1a; 2018-04-04T12:53:17.759Z execjs.eval("Date.now()") 返回值为&#xff1a;152284700108…...

汽车渲染领域:Blender 和 UE5 哪款更适用?两者区别?

在汽车渲染领域&#xff0c;选择合适的工具对于实现高质量的视觉效果至关重要。Blender和UE5&#xff08;Unreal Engine 5&#xff09;作为两大主流3D软件&#xff0c;各自在渲染动画方面有着显著的差异。本文将从核心定位与用途、工作流程、渲染技术和灵活性、后期处理与合成四…...

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版本控制系统时一个分布式系统&#xff0c;是用来保存工程源代码历史状态的命令行工具 简单来说Git的作用就是版本管理工具。 Git的应用场景&#xff1a;多人开发管理代码&#xff1b;异地开发&#xff0c;版本管理&#xff0c;版本回滚。 Git 的三个区域&a…...

如何分析Windows防火墙日志

Windows防火墙&#xff0c;也被称为Windows Defender Firewall&#xff0c;是一种内置的安全功能&#xff0c;可以主动监控和分析运行Windows操作系统的计算机上通过Windows防火墙的网络流量&#xff0c;主要目的是作为计算机和互联网或其他网络之间的屏障&#xff0c;使管理员…...

工作坊报名|使用 TEN 与 Azure,探索你的多模态交互新场景

GPT-4o Realtime API 发布&#xff0c;语音 AI 技术正在进入一场新的爆发。语音AI技术的实时语音和视觉互动能力将为我们带来更多全新创意和应用场景。 实时音频交互&#xff1a; 允许应用程序实时接收并响应语音和文本输入。自然语音生成&#xff1a; 减少 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的搜索和分析引擎&#xff0c;广泛用于大规模数据存储和快速检索。它最初由Shay Banon于20…...

R安装rgdal报错 解决办法

尝试了网上很多办法&#xff0c;不知道哪一步解决了&#xff0c;记录一下所有步骤&#xff1a; 1. 尝试github安装 options(repos c(CRAN "https://mirrors.tuna.tsinghua.edu.cn/CRAN/"))install.packages("devtools")library(devtools)devtools::in…...

【智能制造-46】人机工程(工厂自动化)

工作空间设计 设备布局规划 根据人体测量学数据&#xff0c;合理安排自动化设备、生产线和工作区域的布局。例如&#xff0c;考虑工人的操作空间和活动范围&#xff0c;确保他们能够舒适地接近和操作设备。在汽车装配车间&#xff0c;机器人和工人的工作区域应划分明确&#…...

C#笔记(5)

一、winform项目与窗体控件 1、部分类的使用 好处&#xff1a;让自动生成的代码后置&#xff0c;我们编写程序的代码显得更加简洁 特点&#xff1a;在最后编译的时候&#xff0c;仍然编译成一个窗体类。 窗体和控件的基本使用 3、Event事件&#xff08;委托--》事件&#…...

【软件国产化】| Windows和Linux下文件名后缀是否区分大小写

今天在开发过程中遇到了个软件在Linux系统和Windows系统下功能表现不一致的bug&#xff0c;具体表现为&#xff1a; 插入一张图片&#xff08;A文件夹中的001.jpg&#xff09;&#xff0c;然后使用“图片替换”功能&#xff0c;用B文件夹中的图片&#xff08;B文件夹中的001.JP…...

讨论JAVA、JVM与Spring

Q1: 作为一个JAVA开发人员&#xff0c;对于jvm肯定不陌生&#xff0c;但很多人对它不陌生也仅止于概念上&#xff0c;而且对概念也是模糊不清的&#xff0c;但jvm实际是java程序运行在其中的实际存在的环境&#xff0c;对它的理解应该要是具象化的。 我们还是从一项技术产生的…...

浏览器访问 AWS ECS 上部署的 Docker 容器(监听 80 端口)

✅ 一、ECS 服务配置 Dockerfile 确保监听 80 端口 EXPOSE 80 CMD ["nginx", "-g", "daemon off;"]或 EXPOSE 80 CMD ["python3", "-m", "http.server", "80"]任务定义&#xff08;Task Definition&…...

树莓派超全系列教程文档--(61)树莓派摄像头高级使用方法

树莓派摄像头高级使用方法 配置通过调谐文件来调整相机行为 使用多个摄像头安装 libcam 和 rpicam-apps依赖关系开发包 文章来源&#xff1a; http://raspberry.dns8844.cn/documentation 原文网址 配置 大多数用例自动工作&#xff0c;无需更改相机配置。但是&#xff0c;一…...

LeetCode - 394. 字符串解码

题目 394. 字符串解码 - 力扣&#xff08;LeetCode&#xff09; 思路 使用两个栈&#xff1a;一个存储重复次数&#xff0c;一个存储字符串 遍历输入字符串&#xff1a; 数字处理&#xff1a;遇到数字时&#xff0c;累积计算重复次数左括号处理&#xff1a;保存当前状态&a…...

什么是库存周转?如何用进销存系统提高库存周转率?

你可能听说过这样一句话&#xff1a; “利润不是赚出来的&#xff0c;是管出来的。” 尤其是在制造业、批发零售、电商这类“货堆成山”的行业&#xff0c;很多企业看着销售不错&#xff0c;账上却没钱、利润也不见了&#xff0c;一翻库存才发现&#xff1a; 一堆卖不动的旧货…...

selenium学习实战【Python爬虫】

selenium学习实战【Python爬虫】 文章目录 selenium学习实战【Python爬虫】一、声明二、学习目标三、安装依赖3.1 安装selenium库3.2 安装浏览器驱动3.2.1 查看Edge版本3.2.2 驱动安装 四、代码讲解4.1 配置浏览器4.2 加载更多4.3 寻找内容4.4 完整代码 五、报告文件爬取5.1 提…...

【HarmonyOS 5 开发速记】如何获取用户信息(头像/昵称/手机号)

1.获取 authorizationCode&#xff1a; 2.利用 authorizationCode 获取 accessToken&#xff1a;文档中心 3.获取手机&#xff1a;文档中心 4.获取昵称头像&#xff1a;文档中心 首先创建 request 若要获取手机号&#xff0c;scope必填 phone&#xff0c;permissions 必填 …...

回溯算法学习

一、电话号码的字母组合 import java.util.ArrayList; import java.util.List;import javax.management.loading.PrivateClassLoader;public class letterCombinations {private static final String[] KEYPAD {"", //0"", //1"abc", //2"…...

C++.OpenGL (14/64)多光源(Multiple Lights)

多光源(Multiple Lights) 多光源渲染技术概览 #mermaid-svg-3L5e5gGn76TNh7Lq {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-3L5e5gGn76TNh7Lq .error-icon{fill:#552222;}#mermaid-svg-3L5e5gGn76TNh7Lq .erro…...

JavaScript 数据类型详解

JavaScript 数据类型详解 JavaScript 数据类型分为 原始类型&#xff08;Primitive&#xff09; 和 对象类型&#xff08;Object&#xff09; 两大类&#xff0c;共 8 种&#xff08;ES11&#xff09;&#xff1a; 一、原始类型&#xff08;7种&#xff09; 1. undefined 定…...

Redis:现代应用开发的高效内存数据存储利器

一、Redis的起源与发展 Redis最初由意大利程序员Salvatore Sanfilippo在2009年开发&#xff0c;其初衷是为了满足他自己的一个项目需求&#xff0c;即需要一个高性能的键值存储系统来解决传统数据库在高并发场景下的性能瓶颈。随着项目的开源&#xff0c;Redis凭借其简单易用、…...