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 修改捕获的副本。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/62188.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

TCL大数据面试题及参考答案

Mysql 索引失效的场景 对索引列进行运算或使用函数:当在索引列上进行数学运算、函数操作等,索引可能失效。例如,在存储年龄的列上建立了索引,若查询语句是 “SELECT * FROM table WHERE age + 1 = 20”,这里对索引列 age 进行了加法运算,数据库会放弃使用索引而进行全表扫…

BUUCTF—Reverse—helloword(6)

一道安卓逆向的签到题 下载附件 使用JADX-gui反编译工具打开&#xff08;注意配环境&#xff09;&#xff0c;找到主函数 jadx 本身就是一个开源项目&#xff0c;源代码已经在 Github 上开源了 官方地址&#xff1a;GitHub - skylot/jadx: Dex to Java decompiler 发现flag …

SQL for XML

关系数据模型与SQL SQL for XML 模式名功能RAW返回的行作为元素&#xff0c;列值作为元素的属性AUTO返回表名对应节点名称的元素&#xff0c;每列的属性作为元素的属性输出输出&#xff0c;可形成简单嵌套结构EXPLICIT通过SELECT语法定义输出XML结构PATH列名或列别名作为XPAT…

单点登录深入详解之设计方案总结

基于cookie的单点登录解决方案 概述 用户登录之后 , 将认证信息存储至 Cookie &#xff0c;当再次访问本服务或者访问其他应用服务时&#xff0c;直接从 Cookie 中传递认证信息&#xff0c;进行鉴权处理。 问题 1. 如何保障Cookie内用户认证信息的安全性? 第一, Cookie…

JSONArray 与Object 之间的转换

PageResult<JSONArray> pageResult new PageResult<>();// 查出来的数据 JSONArray resultArray new JSONArray(); ject data new JSONObject();data.put("code", code); resultArray.add(data);// 将resultArray数据放入JSONArray,不是再包装成一个 …

cangjie (仓颉) vscode环境搭建

sdk下载 下载中心-仓颉编程语言官网 可选择半年更新版&#xff0c;不用申请。目前版本&#xff1a;0.53.13 &#xff0c;选择不同平台压缩包下载解压到任意位置即可 补充下载&#xff0c;vscode插件解压后&#xff0c;在vscode扩展中选择从vsix安装&#xff0c;安装后新增名为…

SmartSQL:一款方便、快捷的数据库文档查询、导出工具

&#x1f6a9; 项目介绍 SmartSQL 是一款方便、快捷的数据库文档查询、导出工具&#xff01;从最初仅支持SqlServer数据库、CHM文档格式开始&#xff0c;通过不断地探索开发、集思广益和不断改进&#xff0c;又陆续支持Word、Excel、PDF、Html、Xml、Json、MarkDown等文档格式…

RabbitMQ的预取值详解

RabbitMQ的预取值&#xff08;Prefetch Value&#xff09;是一个关键概念&#xff0c;它决定了消费者在从队列中获取消息时&#xff0c;一次性可以获取的消息数量。这一机制对于优化消息分发和消费者的负载均衡至关重要。 什么是RabbitMQ的预取值&#xff1f; 预取值是指消费者…

IT监控 | Oracle云监控全解析

Oracle云(Oracle Cloud)是Oracle公司提供的云服务平台&#xff0c;涵盖了IaaS、PaaS、SaaS和DaaS&#xff0c;支持企业在云中构建、部署、集成和扩展应用&#xff0c;为企业提供了管理服务器、应用程序、存储、网络和数据中心的全面控制能力。 跟踪Oracle云基础设施的关键组件将…

攻防世界-web ics-06 [解法思路]

进入环境 点击左边的列表只有报表中心有反应 注意看url直接就是index.php?id1 我先试了sqlmap不行&#xff0c;然后就沉淀了一下 想到了id后面的参数问题&#xff0c;我谁便改了几个数都没反应 就想着用bp抓包爆一下这个参数&#xff0c;用了一个数字10000的字典 发现2333…

如何用javascript实现AE内文字图层的打字特效,文字图层包含标题和正文,正文的每句话的出现时间可以自行控制

在Adobe After Effects中实现打字特效&#xff0c;通常会通过使用 Text Animator 和一些 Expressions 来控制文字的逐字出现。你提到希望通过 JavaScript 来控制 AE 内的文字图层&#xff0c;且能够为正文中的每句话设置不同的出现时间。这个需求实际上是通过 After Effects 中…

zotero安卓测试版下载和使用

2023年年底&#xff0c;Zotero官方就已经推出了安卓版的测试版Zotero for Android (beta),&#xff0c;但名额有限且只能通过Google商店下载。此外&#xff0c;还有一些第三方开发的安卓应用&#xff0c;如Zoo for Zotero、ZotDroid等。 在首次使用Zotero安卓版时&#xff0c;用…

洛谷 P1722 矩阵 II C语言 记忆化搜索

题目&#xff1a; https://www.luogu.com.cn/problem/P1722 我们按照案例画一下 我们会发现&#xff0c;会出现重复的子结构。 代码如下&#xff1a; #include<iostream> using namespace std; int mem[300][300]; int n; int f[305][305]; int dfs(int x,int red,…

MCU(一) 时钟详解 —— 以 GD32E103 时钟树结构为例

微控制器 (MCU) 的时钟系统是系统运行的核心&#xff0c;它提供了各模块所需的时钟信号。本文以 GD32E103 系列 MCU 为例&#xff0c;详细讲解其 时钟树结构&#xff08;Clock Tree&#xff09;。通过理解时钟源、分配与预分频器设置&#xff0c;可以灵活配置系统时钟以实现高性…

[HarmonyOS] 解决HMRouter路由地址无法抽取的问题

解决HMRouter路由地址无法抽取的问题 背景 最近开始学习HarmonyOS开发&#xff0c;搭建项目的时候采用了 HMRouter 路由框架&#xff0c;在项目里使用到路由跳转&#xff0c;官方链接在这&#xff1a; https://gitee.com/hadss/hmrouter/blob/master/HMRouterLibrary/README…

高级java每日一道面试题-2024年11月27日-JVM篇-JVM的永久代中会发生垃圾回收么?

如果有遗漏,评论区告诉我进行补充 面试官: JVM的永久代中会发生垃圾回收么? 我回答: 在Java虚拟机&#xff08;JVM&#xff09;的历史版本中&#xff0c;确实存在一个称为“永久代”&#xff08;Permanent Generation, 或者简称PermGen&#xff09;的内存区域。永久代主要用…

转录组数据挖掘(生物技能树)(第11节)下游分析

转录组数据挖掘&#xff08;生物技能树&#xff09;&#xff08;第11节&#xff09; 文章目录 R语言复习转录组数据差异分析差异分析的输入数据操作过程示例一&#xff1a;示例二&#xff1a;示例三&#xff1a;此代码只适用于人的样本 R语言复习 #### 读取 ####dat read.deli…

李宏毅机器学习课程知识点摘要(14-18集)

线性回归&#xff0c;逻辑回归&#xff08;线性回归sigmoid&#xff09;&#xff0c;神经网络 linear regression &#xff0c; logistic regression &#xff0c; neutral network 里面的偏导的相量有几百万维&#xff0c;这就是neutral network的不同&#xff0c;他是…

Labelme常用快捷键

Labelme是一款常用的图像标注工具&#xff0c;其快捷键可以提高标注效率。以下是一些常用的Labelme快捷键&#xff1a; 基本导航 A&#xff1a;切换到上一张图片。D&#xff1a;切换到下一张图片。 标注操作 Ctrl E&#xff1a;选中标注框或标签时按下可打开编辑窗口。Ctrl …

【接口封装】——7、连接并使用 MySQL 数据库

头文件&#xff1a; #include <qsqlquery.h> #include <qsqldatabase.h>&#xff08;注&#xff1a;需要先适配数据库&#xff09; 函数定义&#xff1a; public:bool verifyLogin(const QString& account, const QString& password);QString getUserName(…