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

C++ lambda表达式

目录

1.lambda表达式

1.1什么是Lambda表达式?

1.2Lambda表达式的语法

1.3捕捉列表

1.4函数对象与lambda表达式


1.lambda表达式

1.1什么是Lambda表达式?

Lambda表达式是C++11标准引入的一种匿名函数,它允许你在需要函数的地方直接编写代码块,而无需定义一个完整的函数。Lambda表达式通常用于简化回调函数、简化STL算法的使用等场景。

1.2Lambda表达式的语法

[capture_list] (parameters) mutable-> return_type {
    // function body
}

  • capture_list:捕获列表,用于指定Lambda表达式可以访问的外部变量。编译器根据[]来
    判断接下来的代码是否为lambda函数,捕捉列表能够捕捉上下文中的变量供lambda
    函数使用。

  • parameters:参数列表,普通函数的参数列表一致,如果不需要参数传递,则可以
    连同()一起省略

  • mutable:默认情况下,lambda函数总是一个const函数,mutable可以取消其常量
    性。使用该修饰符时,参数列表不可省略(即使参数为空)。

  • return_type:返回值类型。用追踪返回类型形式声明函数的返回值类型,没有返回
    值时此部分可省略。返回值类型明确情况下,也可省略,由编译器对返回类型进行推
    导。

  • function_body:函数体,在该函数体内,除了可以使用其参数外,还可以使用所有捕获
    到的变量。

注意:
在lambda函数定义中,参数列表和返回值类型都是可选部分,而捕捉列表和函数体可以为
空。因此C++11中最简单的lambda函数为:[]{};该lambda函数不能做任何事情。

// lambda 匿名函数的对象
int main()
{auto add1 = [](int x, int y)->int {return x + y; };cout << add1(1, 2) << endl;auto func1 = []()->int{cout << "hello world" << endl;return 0;};func1();// 返回值类型可自动推导类型,所以可以省略// 无参数可以省略auto func2 = []{cout << "hello world" << endl;return 0;};cout << func2() << endl;auto func3 = []{cout << "hello world" << endl;};func3();return 0;
}

lambda表达式实际上可以理解为无名函数,该函数无法直接调用,如果想要直接调用,可借助auto将其赋值给一个变量。


1.3捕捉列表


    捕捉列表描述了上下文中那些数据可以被lambda使用,以及使用的方式传值还是传引用。

    • [var]:表示值传递方式捕捉变量var
    • [=]:表示值传递方式捕获所有父作用域中的变量(包括this)
    • [&var]:表示引用传递捕捉变量var
    • [&]:表示引用传递捕捉所有父作用域中的变量(包括this)
    • [this]:表示值传递方式捕捉当前的this指针
    int main()
    {// 只能用当前lambda局部域和捕捉的对象和全局对象int a = 0, b = 1, c = 2, d = 3;// 所有值传值捕捉auto func1 = [=]{int ret = a + b + c + d; // 都捕捉了都能用return ret;};// 所有值传引用捕捉auto func2 = [&]{// 传引用捕捉能修改a++;b++;c++;d++;int ret = a + b + c + d;return ret;};// 混合捕捉auto func3 = [&a, b]{// a能修改,b不能a++;// b++;int ret = a + b;return ret;};// 混合捕捉// 所有值以引用方式捕捉,d用传值捕捉auto func4 = [&, d]{a++;b++;c++;//d++;  // d传值捕捉不能修改,其他传引用捕捉都能修改int ret = a + b + c + d;};auto func5 = [=, &d]() mutable // 加了mutable取消了const,传值捕捉的a,b,c都能修改{a++;b++;c++;d++;int ret = a + b + c + d;};return 0;
    }

    1.4函数对象与lambda表达式

    函数对象(也称为仿函数或functor)是一种重载了函数调用操作符operator()的类。这意味着函数对象可以像普通函数一样被调用。

    // 定义一个简单的函数对象
    class Add {
    public:Add(int z):_z(z){}    int operator()(int x, int y) const {return x + y + _z;}
    private:int _z;
    };int main()
    {int z = 1;// 函数对象Add add(1);cout << add(2, 3) << endl;// lambda表达式auto lam = [z](int a, int b)->int{return a + b + z;};cout << lam(2 ,3) << endl;return 0;
    }

    从使用方式上来看,函数对象与lambda表达式完全一样。 函数对象将z作为其成员变量,在定义对象时给出初始值即可,lambda表达式通过捕获列表可以直接将该变量捕获到。

    实际在底层编译器对于lambda表达式的处理方式,完全就是按照函数对象的方式处理的,即:如 果定义了一个lambda表达式,编译器会自动生成一个类,在该类中重载了operator()。


    相关文章:

    C++ lambda表达式

    目录 1.lambda表达式 1.1什么是Lambda表达式&#xff1f; 1.2Lambda表达式的语法 1.3捕捉列表 1.4函数对象与lambda表达式 1.lambda表达式 1.1什么是Lambda表达式&#xff1f; Lambda表达式是C11标准引入的一种匿名函数&#xff0c;它允许你在需要函数的地方直接编写代码…...

    react页面定时器调用一组多个接口,如果接口请求返回令牌失效,清除定时器不再触发这一组请求

    为了实现一个React页面使用定时器调用一组多个接口&#xff0c;并在任意一个接口请求返回令牌失效时清除定时器且不再触发这一组请求&#xff0c;可以遵循以下步骤&#xff1a; 1. 定义API调用函数&#xff1a;创建一个函数来处理一组API调用。每个API调用都应该检查响应状态以…...

    Python的泛型(Generic)与协变(Covariant)

    今天咱们聊聊Python类型标注中的泛型(Generic),与协变(Covariant)。 不了解类型标注的小伙伴,可以先看一看我的上一篇文章 “Python类型检查” Python 类型检查-CSDN博客 例子 这次我开个宠物商店。看下面代码。 class Animal:passclass Dog(Animal):passclass Cat(A…...

    Python Typing: 实战应用指南

    文章目录 1. 什么是 Python Typing&#xff1f;2. 实战案例&#xff1a;构建一个用户管理系统2.1 项目描述2.2 代码实现 3. 类型检查工具&#xff1a;MyPy4. 常见的 typing 用法5. 总结 在 Python 中&#xff0c;静态类型检查越来越受到开发者的重视。typing 模块提供了一种方式…...

    OpenEuler学习笔记(六):OpenEuler与其他Linux服务器的区别是什么?

    OpenEuler是一款基于Linux内核的开源服务器操作系统&#xff0c;与其他Linux服务器操作系统&#xff08;如CentOS、Ubuntu Server等&#xff09;存在多方面的区别&#xff0c;主要体现在以下几个方面&#xff1a; 一、社区与支持 OpenEuler&#xff1a;由华为发起并开源&…...

    如何使用CRM数据分析和洞察来支持业务决策和市场营销?

    如何使用CRM数据分析和洞察来支持业务决策和市场营销&#xff1f; 大家好&#xff01;今天咱们聊聊一个特别重要的话题——如何利用客户关系管理&#xff08;CRM&#xff09;系统中的数据进行分析与洞察能够帮助我们做出更好的业务决策以及提升市场营销效果。其实啊&#xff0…...

    MyBatis和JPA区别详解

    文章目录 MyBatis和JPA区别详解一、引言二、设计理念与使用方式1、MyBatis&#xff1a;半自动化的ORM框架1.1、代码示例 2、JPA&#xff1a;全自动的ORM框架2.1、代码示例 三、性能优化与适用场景1、MyBatis&#xff1a;灵活的SQL控制1.1、适用场景 2、JPA&#xff1a;开发效率…...

    SVN客户端使用手册

    目录 一、简介 二、SVN的安装与卸载 1. 安装&#xff08;公司内部一般会提供安装包和汉化包&#xff0c;直接到公司内部网盘下载即可&#xff0c;如果找不到可以看下面的教程&#xff09; 2. 查看SVN版本 ​编辑 3. SVN卸载 三、SVN的基本操作 1. 检出 2. 清除认证数据 3. 提交…...

    VsCode安装文档

    一、下载 进入VS Code官网&#xff1a;Visual Studio Code - Code Editing. Redefined&#xff0c;点击 DownLoad for Windows下载windows版本 当然也可以点击旁边的箭头&#xff0c;下载Windows版本 或 Mac OS 版本 备注&#xff1a; Stable&#xff1a;稳定版Insiders&#…...

    豆包MarsCode 蛇年编程大作战 | 高效开发“蛇年运势预测系统”

    &#x1f31f; 嗨&#xff0c;我是LucianaiB&#xff01; &#x1f30d; 总有人间一两风&#xff0c;填我十万八千梦。 &#x1f680; 路漫漫其修远兮&#xff0c;吾将上下而求索。 豆包MarsCode 蛇年编程大作战 | &#x1f40d; 蛇年运势预测 在线体验地址&#xff1a;蛇年…...

    【动态规划】--- 斐波那契数模型

    Welcome to 9ilks Code World (๑•́ ₃ •̀๑) 个人主页: 9ilk (๑•́ ₃ •̀๑) 文章专栏&#xff1a; 算法Journey &#x1f3e0; 第N个泰波那契数模型 &#x1f4cc; 题目解析 第N个泰波那契数 题目要求的是泰波那契数&#xff0c;并非斐波那契数。 &…...

    生信软件管家——conda vs pip

    pip vs conda&#xff1a; 安装过python包的人自然两种管理软件都用过&#xff0c; Pip install和Conda install在Python环境中用于安装第三方库和软件包&#xff0c;但它们在多个方面存在显著的区别 总的来说&#xff1a; pip是包管理软件&#xff0c;conda既是包管理软件&…...

    代码随想录——串

    文章目录 反转字符串反转字符串Ⅱ路径加密反转字符串中的单词动态口令字符串匹配重复的子字符串 反转字符串 344. 反转字符串 //前后对应交换 //0<->sSize-1 //1<->sSize-2 //... //i<->sSize-1-i,i0,1,...,(sSize-1)/2 void reverseString(char* s, int s…...

    詳細講一下RN(React Native)中的列表組件FlatList和SectionList

    1. FlatList 基礎使用 import React from react; import { View, Text, FlatList, StyleSheet } from react-native;export const SimpleListDemo: React.FC () > {// 1. 準備數據const data [{ id: 1, title: 項目 1 },{ id: 2, title: 項目 2 },{ id: 3, title: 項目 3…...

    TDengine 与上海电气工业互联网平台完成兼容性认证

    在工业数字化转型和智能化升级的浪潮中&#xff0c;企业对高效、可靠的数据管理解决方案的需求日益增长。特别是在风电智能运维、火电远程运维、机床售后服务等复杂多样的工业场景下&#xff0c;如何实现海量设备和时序数据的高效管理&#xff0c;已经成为推动行业升级的关键。…...

    随机矩阵投影长度保持引理及其证明

    原论文中的引理 2 \textbf{2} 2 1. \textbf{1. } 1. 引理 1 \textbf{1} 1(前提之一) 1.1. \textbf{1.1. } 1.1. 引理 1 \textbf{1} 1的内容 &#x1f449;前提&#xff1a; X ∼ N ( 0 , σ ) X\sim{}N(0,\sigma) X∼N(0,σ)即 f ( x ) 1 2 π σ e – x 2 2 σ 2 f(x)\text{}…...

    深度学习利用数据加载、预处理和增强数据提高模型的性能

    深度学习数据预处理是一个关键步骤&#xff0c;旨在提高模型的性能和准确性。 通过数据加载、预处理和增强&#xff0c;可以显著提高深度学习模型的性能和准确性。在实际应用中&#xff0c;需要根据具体的数据和任务来选择合适的预处理和增强技术。 以下将详细论述并举例说明如…...

    ESP32服务器和PC客户端的Wi-Fi通信

    ESP32客户端-服务器Wi-Fi通信 本指南将向您展示如何设置ESP32板作为服务端&#xff0c;PC作为客户端&#xff0c;通过HTTP通信&#xff0c;以通过Wi-Fi&#xff08;无需路由器或互联网连接&#xff09;交换数据。简而言之&#xff0c;您将学习如何使用HTTP请求将一个板的数据发…...

    新型人工智能“黑帽”工具:GhostGPT带来的威胁与挑战

    生成式人工智能的发展既带来了有益的生产力转型机会&#xff0c;也提供了被恶意利用的机会。 最近&#xff0c;Abnormal Security的研究人员发现了一个专门为网络犯罪创建的无审查AI聊天机器人——GhostGPT&#xff0c;是人工智能用于非法活动的新前沿&#xff0c;可以被用于网…...

    Spring MVC (三) —— 实战演练

    项目设计 我们会将前端的代码放入 static 包下&#xff1a; 高内聚&#xff0c;低耦合 这是我们在实现项目的设计思想&#xff0c;一个项目里存在很多个模块&#xff0c;每一个模块内部的要求类与类、方法与方法要相互配合紧密联系&#xff0c;这就是高内聚&#xff0c;低耦合…...

    【大模型RAG】拍照搜题技术架构速览:三层管道、两级检索、兜底大模型

    摘要 拍照搜题系统采用“三层管道&#xff08;多模态 OCR → 语义检索 → 答案渲染&#xff09;、两级检索&#xff08;倒排 BM25 向量 HNSW&#xff09;并以大语言模型兜底”的整体框架&#xff1a; 多模态 OCR 层 将题目图片经过超分、去噪、倾斜校正后&#xff0c;分别用…...

    生成xcframework

    打包 XCFramework 的方法 XCFramework 是苹果推出的一种多平台二进制分发格式&#xff0c;可以包含多个架构和平台的代码。打包 XCFramework 通常用于分发库或框架。 使用 Xcode 命令行工具打包 通过 xcodebuild 命令可以打包 XCFramework。确保项目已经配置好需要支持的平台…...

    [2025CVPR]DeepVideo-R1:基于难度感知回归GRPO的视频强化微调框架详解

    突破视频大语言模型推理瓶颈,在多个视频基准上实现SOTA性能 一、核心问题与创新亮点 1.1 GRPO在视频任务中的两大挑战 ​安全措施依赖问题​ GRPO使用min和clip函数限制策略更新幅度,导致: 梯度抑制:当新旧策略差异过大时梯度消失收敛困难:策略无法充分优化# 传统GRPO的梯…...

    idea大量爆红问题解决

    问题描述 在学习和工作中&#xff0c;idea是程序员不可缺少的一个工具&#xff0c;但是突然在有些时候就会出现大量爆红的问题&#xff0c;发现无法跳转&#xff0c;无论是关机重启或者是替换root都无法解决 就是如上所展示的问题&#xff0c;但是程序依然可以启动。 问题解决…...

    【Linux】C语言执行shell指令

    在C语言中执行Shell指令 在C语言中&#xff0c;有几种方法可以执行Shell指令&#xff1a; 1. 使用system()函数 这是最简单的方法&#xff0c;包含在stdlib.h头文件中&#xff1a; #include <stdlib.h>int main() {system("ls -l"); // 执行ls -l命令retu…...

    vscode(仍待补充)

    写于2025 6.9 主包将加入vscode这个更权威的圈子 vscode的基本使用 侧边栏 vscode还能连接ssh&#xff1f; debug时使用的launch文件 1.task.json {"tasks": [{"type": "cppbuild","label": "C/C: gcc.exe 生成活动文件"…...

    【ROS】Nav2源码之nav2_behavior_tree-行为树节点列表

    1、行为树节点分类 在 Nav2(Navigation2)的行为树框架中,行为树节点插件按照功能分为 Action(动作节点)、Condition(条件节点)、Control(控制节点) 和 Decorator(装饰节点) 四类。 1.1 动作节点 Action 执行具体的机器人操作或任务,直接与硬件、传感器或外部系统…...

    QT: `long long` 类型转换为 `QString` 2025.6.5

    在 Qt 中&#xff0c;将 long long 类型转换为 QString 可以通过以下两种常用方法实现&#xff1a; 方法 1&#xff1a;使用 QString::number() 直接调用 QString 的静态方法 number()&#xff0c;将数值转换为字符串&#xff1a; long long value 1234567890123456789LL; …...

    大学生职业发展与就业创业指导教学评价

    这里是引用 作为软工2203/2204班的学生&#xff0c;我们非常感谢您在《大学生职业发展与就业创业指导》课程中的悉心教导。这门课程对我们即将面临实习和就业的工科学生来说至关重要&#xff0c;而您认真负责的教学态度&#xff0c;让课程的每一部分都充满了实用价值。 尤其让我…...

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

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