一文教会你lambda表达式

Python 进阶语法:lambda函数 使用lambda函数可以在对列表进行排序时自定义排序规则。print(sorted_numbers) # 输出:[-1, 2, -3, 4, -5]这段代码的目的是对一个数字列表 numbdrs ,用sorted() 函数进行排序,排序的依据是每个数字的绝对值。数字列表。使用sorted()函数对这个列表进行排序。为了按照每个数字的绝对值进行排序,我们使用了一个key参数,该参数是一个函数,用于提取用于排序的值。在这里,我们使用了一个lambda函数,该函数返回每个数字的绝对值。 阅读详情

引言

在现代编程中,Lambda表达式(也称为匿名函数或闭包)已经成为了一种非常流行的编程范式。它允许我们定义简短、一次性的函数对象,而无需显式地定义它们。在C++11及之后的版本中,Lambda表达式得到了官方的支持,为C++程序员带来了极大的便利。本文将详细解释Lambda表达式的概念、语法以及如何使用它们。

Lambda表达式的概念

Lambda表达式是一种匿名函数,即没有具体名称的函数。它可以捕获其所在作用域的变量,并在需要时执行特定的操作。Lambda表达式通常用于实现回调函数、并行计算、排序算法等场景。

Lambda表达式的语法

Lambda表达式的语法相对简单,其基本形式如下:

[capture](parameters) -> return_type { body }
  • [capture]:捕获子句,用于指定Lambda表达式可以访问的外部变量及其访问方式(值捕获或引用捕获)。
  • (parameters):参数列表,与普通函数的参数列表类似,用于指定Lambda表达式的输入参数。
  • -> return_type:返回类型说明符,用于指定Lambda表达式的返回类型。如果Lambda表达式的返回类型可以由编译器自动推导,则可以省略该部分。
  • { body }:Lambda表达式的主体,即函数体,包含要执行的代码。

Lambda表达式的使用

 下面我们将通过几个示例来演示Lambda表达式的使用。

示例1:无参数、无返回值的Lambda表达式



	#include <iostream> 

	


	int main() { 

	auto lambda = [] { 

	std::cout << "Hello, Lambda!" << std::endl; 

	}; 

	lambda(); // 调用Lambda表达式 

	return 0; 

	}

在这个示例中,我们定义了一个无参数、无返回值的Lambda表达式,并将其赋值给lambda变量。然后,我们像调用普通函数一样调用lambda()。

示例2:有参数、有返回值的Lambda表达式

#include <iostream> 
#include <vector> 
#include <algorithm> 


int main() { 
std::vector<int> numbers = {1, 2, 3, 4, 5}; 
std::sort(numbers.begin(), numbers.end(), [](int a, int b) { 
return a < b; // 定义了比较函数 
}); 
// 输出排序后的结果 
for (int num : numbers) { 
std::cout << num << " "; 
} 
std::cout << std::endl; 
return 0; 
}

在这个示例中,我们使用了一个Lambda表达式作为std::sort函数的第三个参数。这个Lambda表达式接受两个整数参数a和b,并返回一个布尔值,用于指示a是否小于b。通过这种方式,我们告诉std::sort函数如何对整数进行排序。

示例3 -- 对回调函数使用lambda 表达式

原程序

#include<iostream>

using namespace std;


bool compare(int a,int b){ // 比较前者是否大于后者
    return  a>b;
}
// 回调函数 -- 获取两数的最大值
int getMax(int a,int b,bool(*compare)(int a,int b))
{
    if(compare(a,b)){
        return a;
    }
    else
        return b;

}

int main()
{
  int a = 55,b=99;
  bool (*funcp)(int ,int ) = compare;
  cout<<getMax(a,b,funcp)<<endl;

  return 0;
}

改进为 lambda 表达式


// 接下来- 我们 可以吧compare 这个函数 改进为 lambda 表达式:


 

int main()
{
  int a = 555,b=99;
  //bool (*funcp)(int ,int ) = compare;


  cout<<getMax(a,b,  [](int a,int b) ->bool {
      return a>b;})<<endl;

  return 0;
}


在这个例子中:
getMax 函数接受两个整数 a 和 b ,以及一个比较函数 compare 。这个比较函数是一个指向函数
的指针,它接受两个整数并返回一个布尔值。
在 main 函数中,我们调用 getMax ,并直接在调用点定义了一个匿名的 lambda 函数。这个
lambda 函数接受两个整数并返回一个表示第一个整数是否大于第二个整数的布尔值。
这个 lambda 函数在 getMax 中被用作比较两个数的逻辑。根据 lambda 函数的返回值, getMax
返回较大的数。
这个例子展示了如何直接在函数调用中使用匿名 lambda 函数,使代码更加简洁和直接。这种方法在需
要临时函数逻辑的场合非常有用,尤其是在比较、条件检查或小型回调中。
在 Lambda 表达式中,参数捕获是指 Lambda 表达式从其定义的上下文中捕获变量的能力。这使得
Lambda 可以使用并操作在其外部定义的变量。捕获可以按值(拷贝)或按引用进行。
让我们通过一个简单的示例来展示带参数捕获的 Lambda 表达式。

Lambda  表达式的捕获列表

三种捕获方式

第一种捕获方式: [x,y] --> 指定变量捕获

     auto add=[x,y]()->int{
           return  x +y;
     }


第二种捕获方式: --> = 一键全部

    auto mul=[=]()->int{ // =  捕获上面的所有变量
        //x++;   //这种方式的捕获是没法修改变量的值 --> 可读 只能使用
        //y = 10;
          return  x*y*z;
    };


第三种捕获方式: --> & 一键全部,并且能拿到他们的地址,进行修改


 

  auto modifAndMul=[&]()->int{ // =  捕获上面的所有变量

         y = 10; //可读可写
         return  x*y*z;
   };

全部整合实例代码;

#include <iostream>
using namespace  std;

int main()
{
    int x = 10;
    int y = 30;

     auto add=[x,y]()->int{
         //x++;   //这种方式的捕获是没法修改变量的值 --> 可读 只能使用
         //y = 10;
           return  x +y;
     };
    cout << add()<<endl;
    int z = 5;
    auto mul=[=]()->int{ // =  捕获上面的所有变量
        //x++;   //这种方式的捕获是没法修改变量的值 --> 可读 只能使用
        //y = 10;
          return  x*y*z;
    };
    int c=66; // 下面的定义的变量 = 就捕获不到 --> 但是不了的 初始化一般都设置在函数的开头
   cout << mul()<<endl;

   //  用引用的方式来进行捕获,类似指针,进行地址访问
   auto modifAndMul=[&]()->int{ // =  捕获上面的所有变量

         y = 10; //可读可写
         return  x*y*z;
   };

  cout << modifAndMul()<<endl<<"y = "<<y<<endl;;

    return 0;
}

输出结果:

说明

在这个例子中:
第一个 Lambda 表达式 sum 按值捕获了 x 和 y (即它们的副本)。这意味着 sum 内的 x 和 y
是在 Lambda 定义时的值的拷贝。
第二个 Lambda 表达式 multiply 使用 [=] 捕获列表,这表示它按值捕获所有外部变量。
第三个 Lambda 表达式 modifyAndSum 使用 [&] 捕获列表,这表示它按引用捕获所有外部变量。
因此,它可以修改 x 和 y 的原始值。
这个示例展示了如何使用不同类型的捕获列表(按值和按引用)来控制 Lambda 表达式对外部变量的访问和修改。按值捕获是安全的,但不允许修改原始变量,而按引用捕获允许修改原始变量,但需要注意引用的有效性和生命周期问题。

请注意,虽然 Lambda 函数和内联函数在某些方面有相似之处,如它们都可以被编译器优化以减少调用开销,但它们在设计和用途上有明显的不同。Lambda 函数的核心优势在于它们的匿名性和对外部变量的捕获能力,而内联函数则主要关注于提高小型函数的性能。

内联函数

概念


内联函数(Inline Function)是C++中一种特殊的函数,其定义直接在每个调用点展开。这意味着编译器会尝试将函数调用替换为函数本身的代码,这样可以减少函数调用的开销,尤其是在小型函数中。


特点


1. 减少函数调用开销:内联函数通常用于优化小型、频繁调用的函数,因为它避免了函数调用的常规开销(如参数传递、栈操作等)。


2. 编译器决策:即使函数被声明为内联,编译器也可能决定不进行内联,特别是对于复杂或递归函数。


3. 适用于小型函数:通常只有简单的、执行时间短的函数适合做内联。

4. 定义在每个使用点:内联函数的定义(而非仅仅是声明)必须对每个使用它的文件都可见,通常意味着将内联函数定义在头文件中。


使用方法


通过在函数声明前添加关键字 inline 来指示编译器该函数适合内联:

inline int max(int x, int y) {
return x > y ? x : y;
}

示例

#include <iostream>
inline int add(int a, int b) {
return a + b;
}
int main() {
int result = add(5, 3); // 编译器可能会将此替换为:int result = 5 + 3;
std::cout << "Result: " << result << std::endl;
return 0;
}

在这个示例中,函数 add 被定义为内联函数。当它被调用时,编译器可能会将函数调用替换为函数体内的代码。

注意事项


过度使用的风险:不应滥用内联函数,因为这可能会增加最终程序的大小(代码膨胀)。对于大型函数或递归函数,内联可能导致性能下降。


编译器的决定:最终是否将函数内联是由编译器决定的,即使函数被标记为 inline 。


适用场景:最适合内联的是小型函数和在性能要求高的代码中频繁调用的函数。


内联函数是一种用于优化程序性能的工具,但需要合理使用,以确保代码的可维护性和性能的平衡。

 Lambda 函数和内联函数在 C++ 中的相似之处和区别:

Lambda表达式详解 本专栏已有文章对这个关键字进行了纤细的介绍,这里不再赘述,关于为什么对于值捕获方式的变量不能再函数体(body)中修改参见本文第二章节。int x = 0;return ++x;// 允许修改值捕获的变量。 阅读详情

相关推荐

跨境TRS投资操作指南与系统解决方案

3 点击【申请 TRS 账户】,查看风险披露,录入账户参数、确定录入的参数信息,进行身份验证,输入验证码,TRS 账户开户申请已提交,后台对已提交的 TRS 开户申请进行审核,审核成功后,短信邮箱提醒,进行登录;2.点击【申请TRS账户】,查看风险披露,录入账户参数、确定录入的参数信息,进行身份验证,输入验证码,TRS账户开户申请已提交,后台对已提交的TRS开户申请进行审核,审核成功后,短信邮箱提醒,进行登录;4)更广泛的投资选择:相比A股通,TRS可以交易更多的A股标的,提供了更广泛的投资选择。

2401_85487119的博客 2852

Lambda表达式

文章目录1.什么是Lambda表达式2.为什么使用Lambda表达式3.Lambda表达式语法4.函数式接口4.1 什么是函数式接口4.2 自定义函数式接口4.3 Java内置函数式接口5.方法引用6.构造器引用7.数组引用8.Lambda表达式的作用域8.1 访问局部变量8.2 访问局部引用,静态变量,实例变量8.3 Lambda表达式访问局部变量作限制的原因9.Lambda表达式的优缺点 1.什么是Lambda表达式 Lambda表达式,也可称为闭包。类似于JavaScript中的闭包,它是推动Java

小赵的呢 7085

知识图谱本体建模之RDF、RDFS、OWL详解

(一)知识图谱本体建模之RDF、RDFS、OWL详解 1.语义网体系 知识图谱于2012年由Google提出,并不是新概念,而是由语义网络(Semantic Network)衍生而来。语义网络由相互连接的节点和边组成,节点表示概念或者对象,边表示他们之间的关系。RDF,RDFS与OWL都是基于语义网的知识表示框架,在节点和边的取值上做了约束,制定了统一标准,为多源数据的融合提供了便利。RDF,RDFS/OWL 属于语义网技术栈,它们的提出,使得语义网克服了语义网络的缺点。其语义网技术栈如下所示。 2.RD

周周的专栏 1万+

Lambda 表达式

一.什么事Lambda表达式 Lambda 表达式是一种匿名函数,也可称为闭包,简单地说,它是没有声明的方法,也即没有访问修饰符、返回值声明和名字。 它可以写出更简洁、更灵活的代码。作为一种更紧凑的代码风格,使 Java 语言的表达能力得到了提升。 二.Lambda表达式的语法 lambda 表达式的语法格式如下: (parameters) -> expression 或 (par...

xxdw1992的博客 1万+

ArcGIS属性表汉字转拼音

接着我安装了一个编辑器“PyCharm Community Edition 2019.3.3\bin\pycharm64.exe”,在里面添加“pypinyin”包,然后将其设置为arcgis的编辑器和调试程序,还是失败;我在10.6的机器上折腾了上面几步,直到两周后脚本突然运行成功,我也不确定是哪一步导致pypinyin包配置成功,因此将心得体会写出来,如果过一段时间,打开10.2的机器运行脚本成功了,再写后续.......,按照“配置方法1:”进行尝试,显示配置失败。

2301_77413856的博客 1295

软件测试 | 手把手教你如何使用 Charles 抓包工具(电脑+手机端)

软件测试 | 手把手教你如何使用 Charles 抓包工具(电脑+手机端)一、Charles简介二、Charles下载与安装三、Charles配置(1)Charles-PC端的配置如下:(2)过滤网络请求:(3)Charles抓取HTTPS请求包前置条件:(4)Charles抓取HTTPS双向认证包:关注我,免费领取学习资料 嘿。大家好,我是4U: 做过 APP 测试的同学都会接触抓包工具,通过抓包工具可以获取到客户端与服务端接口的交互数据,在实际测试APP的过程中,我们往往会发现服务端返回 的参数字段错

leboxy的博客 4153

Java中的Lambda表达式 一文教会你lambda表达式的用法

函数式编程,lambda表达式

weixin_46140377的博客 1402

ORB-SLAM3复现的详细过程——配置安装及ROS和脚本运行---Ubuntu20.04

所提供的图像具有高动态范围,事先进行了光度标定,用20Hz的帧率采集,分辨率为1024像素*1024像素;需要下载数据集dataset-room1_512_16和rgbd_dataset_freiburg1_desk。在一键安装ROS后,只需要再安装Pangolin即可,其他所有的需要都已经存在。用微型飞行器采集的视觉惯性数据集,包含双目相机和IMU同步测量数据及位姿的真值。第二条命令中的${ROS_PACKAGE_PATH}是自己文件的路径。其采用的相机和IMU传感器,在硬件上进行了时间同步。

琉璃轻纱的博客 1万+

Java 8:一文掌握 Lambda 表达式

本文将介绍 Java 8 新增的 Lambda 表达式,包括 Lambda 表达式的常见用法以及方法引用的用法,并对 Lambda 表达式的原理进行分析,最后对 Lambda 表达式的优缺点进行一个总结。

孙强 Jimmy 的博客 2万+

面向企业级应用的 SAP UI5 troubleshooting 全景指南:从日志与调试到性能与可测试性

本指南系统化介绍了SAP UI5应用排错的完整流程和工具链。从基础的浏览器开发者工具使用,到SAP UI5专用调试工具(Technical Information Dialog、Support Assistant、Diagnostics Window),再到性能优化和日志管理,提供了一套工程化的解决方案。重点推荐组合使用UI5 Inspector扩展、Test Recorder测试工具以及性能测量模块,并强调将常见问题整理成团队知识库。通过制度化的排错步骤和工具组合,开发者可以快速定位、复现和修复问题,将调

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 283

【华为OD机试真题 新系统】1043、魔法咒语组合 | 机试真题+思路参考+代码解析(C++、Java、Py、C语言、JS)

【华为OD机试真题 新系统】1043、魔法咒语组合 | 机试真题+思路参考+代码解析(C++、Java、Py、C语言、JS) 华为od机试,华为od机试真题,华为od机试E卷,华为odE卷,华为od机试真题E卷,华为OD,华为OD机试,华为OD机试真题,华为od机考,华为od机试D卷,华为od机试真题D卷,华为od手撕代码,华为od,华为od机试C卷,华为od e卷,华为2026e卷,od机试,2026E卷,华为OD机试E卷,什么是华为od,华为od介绍,全面了解华为od,2026华为od,如何备战华为od

KJ.JK 283

一文读懂C++11的Lambda表达式的用法与原理

一文读懂C++11的Lambda表达式的用法与原理1、Lambda表达式简介2、Lambda表达式使用方法介绍3、Lambda表达式实现原理解析4、总结 1、Lambda表达式简介 Lambda表达式(lambda expression)是一个匿名函数,Lambda表达式基于数学中的λ演算得名,直接对应于其中的lambda抽象(lambda abstraction),是一个匿名函数,即没有函数名的函数。Lambda表达式可以表示闭包(注意和数学传统意义上的不同)。 2、Lambda表达式使用方法介绍 C

游戏行业资深搬砖人员 5778

YOLOv11【第二章:核心模块进阶篇·第28节】DynamicHead动态检测头设计!

🏆 本文收录于专栏 《YOLOv11实战:从入门到深度优化》。本专栏围绕 YOLOv11 的改进、训练、部署与工程优化 展开,系统梳理并复现当前主流的 YOLOv11 实战案例与优化方案,内容目前已覆盖 分类、检测、分割、追踪、关键点、OBB 检测 等多个方向。

**My Coding Family** 1万+

一文带你搞懂Lambda表达式

Java Lambda表达式,今天你学废了吗?

程序员青戈 5832

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

C# Lambda表达式

C#,Lambda表达式

鲤籽鲲的博客 1万+

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

分分钟教会你使用Lambda表达式

Java 中使用 Lambda表达式Lambda的作用Lambda表达式的作用主要是用来简化接口的创建,interface。 需要注意的是: 1.任何需要使用interface的地方都可以使用Lambda表达式来简化; 2.Lambda表达式不能够简化类或者抽象类得创建,如果试图使用Lambda表达式去创建一个类或者抽象类 将会报错如下英文信息 ”Target type of a lambd

ylqhust的专栏 6078

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

一文搞懂Lambda表达式

/ 实现加法操作System.out.println("加法结果: " + addition.operate(5, 3));// 实现减法操作System.out.println("减法结果: " + subtraction.operate(5, 3));

Rockivy的博客 1169

一文搞懂Java Lambda表达式

目录 Lambda表达式背景引入 Lambda表达式语法 Lambda表达式语法详讲 Lambda表达式的精简语法 方法引用 构造方法引用 综合案例 @FunctionalInterface注解 系统内置函数式接口 Lambda表达式背景引入 Lambda是Java8的新特性,使用Lambda表达式会使设计的代码更简洁,用它可以替代我们以前写的匿名内部类来实现接口,Lambda表达式本质上是一个匿名函数。 下面我们通过一个简单的例子来体会一下Lambda表达式: ...

qq_42681787的博客 2481

一文掌握Lambda表达式

本文转自:https://blog.youkuaiyun.com/u013541140/article/details/102710138 本文将介绍 Java 8 新增的 Lambda 表达式,包括 Lambda 表达式的常见用法以及方法引用的用法,并对 Lambda 表达式的原理进行分析,最后对 Lambda 表达式的优缺点进行一个总结。 1. 概述 Java 8 引入的 Lambda 表达式的主...

菜鸟日记 799

一文带你搞懂java的lambda表达式

一文带你快速上手lambda表达式

weixin_45642975的博客 1000

一文搞定Java的Lambda表达式

写在前面的话:“在成功的道路上,活力是需要的,志向是可贵的,但更重要的是那毫无情趣的近乎平常的坚守的毅力和勇气。”你好,我是梦阳辰,未来我和你一起成长。 什么是Lambda表达式? Lambda是一个匿名函数,我们可以把Lambda表达式理解为是一段可以传递的代码(将代码像数据一样进行传递)。 Lambda允许把函数作为一个方法的参数(函数作为参数传递到方法中)。 为什么要使用Lambda表达式? 可以写出更简洁的,更灵活的代码。作为一种更紧凑的代码风格,是java的语言表达能力得到了提升。 对比: i.

轻松玩编程 439
上一篇: C++ 复习2 输入输出 & 基本数据类型
下一篇: C++数组和指针应用实例 -- 实现计算器
mx_jun
博客等级 码龄5年 1605粉丝 148原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值