【C++11】lambda表达式 的定义、性质和用法

news2024/9/9 0:41:50

定义

Lambda表达式是C++11引入的一种函数对象的匿名表示方法。它可以用于定义轻量级的、临时的、内联的函数对象,通常用于函数式编程的场景。

语法结构

Lambda表达式的 基本语法 如下:

lambda表达式书写格式:[capture-list] (parameters) mutable -> return-type {
	// 函数体 - statement
}

ambda表达式各部分说明:

  • [capture-list] : 捕捉列表,该列表总是出现在lambda函数的开始位置,编译器根据[]来判断接下来的代码是否为lambda函数,捕捉列表能够捕捉上下文中的变量供lambda函数使用。
  • (parameters):参数列表。与普通函数的参数列表一致,如果不需要参数传递,则可以连同()一起省略
  • mutable:默认情况下,lambda函数总是一个const函数,mutable可以取消其常量性。使用该修饰符时,参数列表不可省略(即使参数为空)。
  • ->returntype:返回值类型。用追踪返回类型形式声明函数的返回值类型,没有返回值时此部分可省略。返回值类型明确情况下,也可省略,由编译器对返回类型进行推导。
  • {}中是Lambda表达式的函数体,包含了实际要执行的代码逻辑

需要注意的是:

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

在这里插入图片描述

关于 捕获列表

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

  • [var]:表示值传递方式捕捉变量var
  • [=]:表示值传递方式捕获所有父作用域中的变量(包括this)
  • [&var]:表示引用传递捕捉变量var
  • [&]:表示引用传递捕捉所有父作用域中的变量(包括this)
  • [this]:表示值传递方式捕捉当前的this指针

性质

  1. 父作用域指包含lambda函数的语句块
  2. 语法上捕捉列表可由多个捕捉项组成,并以逗号分割。例如:

[=, &a, &b]:以引用传递的方式捕捉变量a和b,值传递方式捕捉其他所有变量 [&,a, this]:值传递方式捕捉变量a和this,引用方式捕捉其他变量

  1. 捕捉列表不允许变量重复传递,否则就会导致编译错误。例如:

比如:[=, a]:=已经以值传递方式捕捉了所有变量,捕捉a重复

  1. 在块作用域以外的lambda函数捕捉列表必须为空。
  2. 块作用域中的lambda函数仅能捕捉父作用域中局部变量捕捉任何非此作用域或者非局部变量都会导致编译报错
  3. lambda表达式之间不能相互赋值,即使看起来类型相同

原因:Lambda表达式是一种匿名函数,它生成的函数对象是一个闭包。每个Lambda表达式都有其自己的类型,并且不同的Lambda表达式具有不同的类型。因此,Lambda表达式之间不能直接相互赋值。

可以使用 函数指针 / std::function 进行函数赋值

// 函数指针实现 函数赋值
void f1() {
    std::cout << "hello" << std::endl;
}

void f2() {
    std::cout << "hello" << std::endl;
}

int main()
{
    void (*pf)();
    pf = f1; // 将函数指针pf指向f1
    pf();    // 调用f1函数

    pf = f2; // 将函数指针pf指向f2
    pf();    // 调用f2函数

    return 0;
}

常见用法

1. 作为函数对象传递:

Lambda表达式可以作为参数传递给需要函数对象作为参数的函数,例如:

// 函数接受一个函数对象作为参数
void process(std::function<void(int)> func) {
    // ...
}

// 调用时使用Lambda表达式作为参数
process([](int x) {
    // Lambda表达式的逻辑
    // ...
});

2. 在算法中使用:

Lambda表达式可以与标准库中的算法一起使用,用于指定算法的操作行为,例如:

std::vector<int> nums = {1, 2, 3, 4, 5};

// 使用Lambda表达式作为排序准则
std::sort(nums.begin(), nums.end(), [](int a, int b) {
    return a < b;
});

// 使用Lambda表达式作为条件判断
auto it = std::find_if(nums.begin(), nums.end(), [](int num) {
    return num > 3;
});

3. 自定义比较器:

Lambda表达式可以用来定义自定义的比较器,例如在容器排序或二叉搜索树中使用,例如:

struct Person {
    std::string name;
    int age;
};

std::vector<Person> people = {{"Alice", 25}, {"Bob", 30}, {"Charlie", 20}};

// 使用Lambda表达式定义自定义比较器
std::sort(people.begin(), people.end(), [](const Person& p1, const Person& p2) {
    return p1.age < p2.age;
});

4. 异步编程:

Lambda表达式可以用于异步编程,例如与std::async一起使用,创建异步任务,例如:

auto future = std::async([]() {
    // 异步任务的逻辑
    // ...
    return result;
});

// 获取异步任务的结果
auto result = future.get();

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

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

相关文章

java8 新特性 —— Lambda 表达式

我们来看一段老版本的示例代码&#xff0c;其对一个含有字符串的集合进行排序&#xff1a;&#xff08;示例代码创建了一个匿名内部类作为入参。&#xff09; // Collections 工具类提供了静态方法 sort 方法&#xff0c;入参是一个 List 集合&#xff0c;和一个 Comparator 比…

C++栈和队列(详解+刷题)

&#x1f442; 爱要坦荡荡 - 萧潇 - 单曲 - 网易云音乐 &#x1f442; 武侯祠 - 闫东炜 - 单曲 - 网易云音乐 &#x1f442; You Are My Sunshine - Angelika Vee - 单曲 - 网易云音乐 (๑•̀ㅂ•́)و✧ O(∩_∩)O (ง •_•)ง (&#xff5e;﹃&#xff5e;)~zZ …

微鳄三六五软件,企业实现数字化转型仅需2万

关键词&#xff1a;OA办公系统、知识管理系统、群晖NAS 编者按&#xff1a; 疫情对全球经济有着巨大冲击&#xff0c;有调查表明80%的中小企业营收下滑&#xff0c;有30%的中小企业营收减半。天翎特此推出万元即可实现数字化管理方案&#xff0c;为企业提供办公管理、项目管理、…

Canvas.arcTo() 的使用,画一条带圆角的线段,画一个思维导图一基础

Canvas.arcTo() 的使用&#xff0c;画一条带圆角的线段&#xff0c;画一个思维导图一基础 一、方法定义 canvas.arcTo 这个方法还是比较难理解的。因为它不是直观的绘制路径&#xff0c;而是间接的。 它的参数是这样的。 canvas.arcTo(ax,ay,bx,by,radius)它是由两个点和一个…

密码学学习笔记(十):Digital Signatures - 数字签名1

什么是数字签名&#xff1f; 想象一下一下情景&#xff1a; Alice生成两个密钥&#xff1a;一个公钥&#x1d443;&#x1d43e;&#x1d434; & 对应的密钥&#x1d446;&#x1d43e;&#x1d434;, 发布公钥&#xff0c;保留密钥然后Alice使用&#x1d446;&#x1d4…

ARG DEBIAN_FRONTEND=noninteractive作用说明

使用 在Dockerfile中使用ARG指令定义变量并为其指定一个默认值。ARG指令用于在构建过程中传递变量的值。 对于DEBIAN_FRONTENDnoninteractive&#xff0c;它定义了一个名为DEBIAN_FRONTEND的变量&#xff0c;并将其默认值设置为noninteractive。在这个上下文中&#xff0c;no…

【uniapp开发h5】点击复制微信号并自动打开微信应用,类似可以唤起淘宝、知乎应用等

效果展示&#xff1a; 准备工作&#xff1a; 引用jquery.js 和 clipboard.min.js jQuery就不用多说了&#xff0c;而clipboard.min.js 是一个 JavaScript 库&#xff0c;用于实现网页上的复制到剪贴板功能。它提供了一种简单的方式来处理复制操作&#xff0c;无需使用浏览器原…

Ubuntu 包管理的 20 个“apt-get”命令

动动发财的小手&#xff0c;点个赞吧&#xff01; 在引入 apt 命令之前&#xff0c;apt-get 命令是基于 Debian 的 Linux 发行版中使用的主要包管理命令。 使用 apt-get 命令&#xff0c;您可以在系统上安装、删除、升级、搜索和管理软件包。然而&#xff0c;从 Ubuntu 16.04 和…

22运动估计(matlab程序)

1.简述 实验目的 熟悉运动估计的块匹配&#xff08;BMA&#xff09;算法原理&#xff0c;编程实现全搜索算法&#xff08;三步搜索或钻石搜索算法&#xff09;&#xff0c;了解运动估计在混合编码器中的作用。 实验内容 1&#xff09;编写全搜索算法函数&#xff0c;将运动矢量…

使用Llama.cpp在CPU上快速的运行LLM

大型语言模型(llm)正变得越来越流行&#xff0c;但是它需要很多的资源&#xff0c;尤其时GPU。在这篇文章中&#xff0c;我们将介绍如何使用Python中的llama.cpp库在高性能的cpu上运行llm。 大型语言模型(llm)正变得越来越流行&#xff0c;但是它们的运行在计算上是非常消耗资源…

MongoDB教程-5

复制是跨多个服务器同步数据的过程。复制在不同的数据库服务器上提供数据的多个副本&#xff0c;从而提供冗余并提高数据可用性。复制可防止数据库丢失单个服务器。复制还允许您从硬件故障和服务中断中恢复。通过增加数据拷贝&#xff0c;您可以将其中一个用于灾难恢复、报告或…

Spring系列4 -- Bean的作用域和生命周期

目录 1. 案例 2. 作用域定义 2.1 Bean的6种作用域 2.2 设置作用域 3. Sring的执行流程 4. Bean的生命周期 思考: 为什么不是先进行初始化然后再进行设置属性呢? 1. 案例 假设现在有⼀个公共的 Bean&#xff0c;提供给 A ⽤户和 B ⽤户使⽤&#xff0c;然⽽在使⽤的途中…

【面试】Hbase

逻辑模型 1 NameSpace 命名空间&#xff0c;类似于关系型数据库的database概念&#xff0c;每个命名空间下有多个表。Hbase有两个自带的命名空间,分别是hbase和default, hbase中存放的是HBase内置的表, default表是用户默认使用的命名空间。 2 Region 类似于关系型数据库的表…

综合 案例

案例1&#xff1a;淘宝焦点图布局 基本结构 1.大盒子我们类名为: tb-pro淘宝广告 2.里面先放一张图片 3.左右两个按钮用链接。左箭头prev 右箭头 next 4.底侧小圆点用ul 类名为pro-nav 注意&#xff1a; 1.如果一个盒子既有left属性也有right属性&#xff0c;则默认会执行lef…

Nvidia Jetson Orin系列配置教程

Nvidia Jetson Orin系列配置教程包含Orin系列的安装及配置办法&#xff0c;目前最为推荐的办法是通过Nvidia SDK Manager进行安装&#xff0c;详细内容如下&#xff1a; 法1&#xff1a;通过Nvidia SDK Manager进行安装 1.下载工具 前往Nvidia SDK Manager下载工具 2.安装工…

Lesson3-3:OpenCV图像处理---图像平滑

图像平滑 学习目标 了解图像中的噪声类型了解平均滤波&#xff0c;高斯滤波&#xff0c;中值滤波等的内容能够使用滤波器对图像进行处理 1 图像噪声 由于图像采集、处理、传输等过程不可避免的会受到噪声的污染&#xff0c;妨碍人们对图像理解及分析处理。常见的图像噪声有高…

MySQL之CRUD及常见面试题讲解

目录 一、CRUD是什么 二、什么是SQL注入 三、行转列的使用 四、CRUD中常用关键词 关键词&#xff1a; GROUP BY HAVING ORDER BY 五、聚合函数和连表查询 聚合函数 连表查询 六、DELETE、TRUNCATE、DROP的区别 七、MySQL常见面试题讲解 一、CRUD是什么 CRUD是一个常…

ARMv8的异常等级(Exception Level)以及执行状态(AArch64/AArch32)

目录 1&#xff0c;异常等级&#xff08;Exception Level&#xff09; 2&#xff0c;Execution states&#xff0c;执行状态 AArch64的异常等级 AArch32的异常等级 3&#xff0c;异常等级切换 4&#xff0c;执行状态切换&#xff08;AArch64 <> AArch32&#xff09;…

文件下载功能(简单粗暴)

文件下载功能 // 模板下载 export const modelLoadInterface (data: any) > {return get<Response>(tsureexapp-exchange/config/points/grant/export.json, data, {skipErrorHandler: true,}); };import {modelLoadInterface} from "/services/CommunicationF…

山西电力市场日前价格预测【2023-07-11】

日前价格预测 预测明日&#xff08;2023-07-11&#xff09;山西电力市场全天平均日前电价为419.66元/MWh。其中&#xff0c;最高日前价格为490.80元/MWh&#xff0c;预计出现在11: 45。最低日前电价为365.06元/MWh&#xff0c;预计出现在24: 00。 价差方向预测 1&#xff1a;实…