广告
返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >C++lambda表达式使用介绍
  • 615
分享到

C++lambda表达式使用介绍

C++lambda表达式C++lambda函数 2022-11-13 15:11:09 615人浏览 泡泡鱼
摘要

目录前言lambda表达式格式一些语法走进底层前言 c++98中的一个例子。 #include <iOStream> #include <vector> #i

前言

c++98中的一个例子。

#include <iOStream>
#include <vector>
#include <string>
#include <alGorithm>
using namespace std;
struct Goods
{
	string _name;
	float _price;
	int _evaluate;
	Goods(const char* str, double price, int evaluate)
		:_name(str)
		, _price(price)
		, _evaluate(evaluate)
	{}
};
struct PriceGreater
{
	bool operator()(const Goods& g1, const Goods& g2)
	{
		return g1._price < g2._price;
	}
};
struct PriceLess
{
	bool operator()(const Goods& g1, const Goods& g2)
	{
		return g1._price > g2._price;
	}
};
int main(void)
{
	vector<Goods> v{ {"苹果", 3.15, 5}, {"香蕉", 4.2, 3}, {"西瓜", 2.8, 4} };
	sort(v.begin(), v.end(), PriceLess()); //按价格的降序比较
	sort(v.begin(), v.end(), PriceGreater()); //按价格的升序比较
	return 0;
}

如果待排序的元素是自定义类型,使用sort算法排序时,需要用户去定义仿函数类。如果每次比较逻辑不同,就需要实现不同仿函数类,这是极其不方便的。所以c++11语法增加了Lambda表达式。

lambda表达式格式

lambda表达式的格式

[捕捉列表](参数列表)mutable->返回值类型{ 语句部分 };

其中参数列表、返回值类型是可选的,捕捉列表、函数体可以为空。

先来看一个较为简单的lamda表达式

int main(void)
{
	auto add = [](int a, int b)->int {return a + b; };
	cout << add(1, 2) << endl;
	return 0;
}

mutable可以省略,暂时不考虑。

  • 捕捉列表,捕捉列表的[]是千万不能省略的,编译器会根据[]判断该表达式是否为lambda表达式,捕捉列表能够捕捉上下文的变量提供给lambda表达式使用。
  • 参数列表,就和普通的函数传参是一样的,如果不需要参数,那么可以连同()一起省略
  • mutable:默认情况下,lambda表达式参数列表和捕捉列表被修饰成const属性,而mutable的作用就是取消它的const属性。如果使用了mutable参数一定不能省略,如果参数为空,那么需要保留()
  • ->返回值类型。返回值类型明确或没有返回值的情况下,该部分可省略,编译器会对返回值类型进行推导。
  • 语句部分。和不同函数的函数体内语句部分是一样的含义,函数体内不仅可以使用它的参数,还可以使用所有捕获到的变量。

所以最简单的lambda表达式应该是[]{}

lambda表达式又被称为匿名函数,无法被直接调用,它的底层其实也是仿函数类。需要借助auto将表达式赋值给一个变量。

一些语法

lambda表达式的捕捉列表不能捕捉全局变量/静态变量

//lambda表达式的捕捉列表不能捕捉全局变量 / 静态变量
int c = 0, d = 0;
auto func1 = [c, d]() {};
int main(void)
{
	static int a = 0;
	static int b = 0;
	auto func1 = [a, b]() {};
	return 0;
}

如果想要改变参数/捕捉列表,那么就需要加mutable取消const 属性

//交换两个变量的值,方式一:
	int a = 1, b = 2;
	auto swap1 = [](int& x, int& y)mutable {int tmp = x; x = y; y = tmp; };
	swap1(a, b);

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

[var]:表示值传递方式捕捉变量var

[=]:表示值传递方式捕获所有父作用域中的变量(包括this)

[&var]:表示引用传递捕捉变量var

[&]:表示引用传递捕捉所有父作用域中的变量(包括this)

[this]:表示值传递方式捕捉当前的this指

默认情况下,使用值传递的方式,捕捉到的变量被修饰成const属性;引用传递方式没有被修饰。

函数体内使用捕捉到变量,实际上是捕捉变量的一份拷贝,所以需要对捕捉变量进行修改时,不能使用值传递的方式。

//交换两个变量的值,方式二:
	auto swap3 = [&c, &d](){int tmp = c; c = d; d = tmp; };
	swap3();

【捕捉列表注意】

同一个变量不能被同一种传递方式多次捕捉。捕捉的范围:父作用域中所有的非静态局部变量。

走进底层

调用lambda表达式的时候,先把它赋值给auto类型的对象,然后再使用()调用。

auto的作用是自动推导右边表达式的类型,那么lambda表达式的类型是什么?

add是一个类对象,类名为<lambda_+uuid>,点击此处了解uuid。

增加一个lambda表达式的调用
add(1, 2);

转到反汇编,发现它的类里重载了(),调用lambda表达式的底层是去调用类成员方法operator()

可见lambda表达式的底层就是仿函数类,所以它的调用方法也和仿函数是一样的。

不同的lambda表达式生成的类,是不同的类。一个lambda表达式再写一份,生成的类也是不同的,可以认为一个lambda表达式语句生成一个自己唯一的类。

	//lambda表达式格式
	auto add = [](int a, int b)->int {return a + b; };
	add(1, 2);
	auto add2 = [](int a, int b)->int {return a + b; };
	add2(1, 2);

因此要注意,lambda表达式之间不能相互赋值。

到此这篇关于C++lambda表达式使用介绍的文章就介绍到这了,更多相关C++lambda内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: C++lambda表达式使用介绍

本文链接: https://www.lsjlt.com/news/166081.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • C++lambda表达式使用介绍
    目录前言lambda表达式格式一些语法走进底层前言 C++98中的一个例子。 #include <iostream> #include <vector> #i...
    99+
    2022-11-13
    C++lambda表达式 C++lambda函数
  • Java中Lambda表达式用法介绍
    Lambda lambda是一个匿名函数,我们可以把lambda表达式理解为是一段可以传递的代码。 lambda简明的地将代码或方法作为参数传递进去执行。 “函数式...
    99+
    2022-11-12
    Java Lambda表达式 Lambda表达式
  • C++11 lambda(匿名函数)表达式详细介绍
    目录前言概念及基本用法捕获变量lambda表达式类型声明式的编程风格总结前言 Lambda(匿名函数)表达式是C++11最重要的特性之一,lambda来源于函数式编程的概念,也是现代...
    99+
    2022-11-13
    c++11 lambda函数 c++11 lambda表达式什么时候用 lambda表达式方法引用
  • C# 本地函数与 Lambda 表达式详细介绍
    目录1、C# 本地函数与 Lambda 表达式2、Lambda 表达式3、本地函数4、那么,局部函数的目的是什么?1、C# 本地函数与 Lambda 表达式 C# 局部函数通常被视为...
    99+
    2022-11-12
    C# 本地函数 Lambda 表达式
  • Kotlin方法与Lambda表达式实践使用介绍
    目录前言一、Kotlin的方法1、方法声明2、方法参数3、方法作用域二、Lambda表达式1、Lambda表达式的特点2、Lambda实践总结前言 经过前面对 Kotlin 的介绍,...
    99+
    2022-11-13
    Kotlin 方法 Kotlin Lambda表达式
  • 【javaSE】 Lambda表达式与Lambda表达式的使用
    文章目录 🌳Lambda表达式的背景🚩Lambda表达式的语法🚩函数式接口 🎋Lambda表达式的基本使用🎄...
    99+
    2023-09-15
    开发语言 java Lambda表达式 源码
  • C#中如何使用Lambda表达式
    本篇文章为大家展示了C#中如何使用Lambda表达式,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。C# Lambda表达式我们从“所有字符串查找包含YJingLee子字符串”说起。在C# 2.0中,...
    99+
    2023-06-17
  • C#中Lambda表达式如何使用
    本篇内容介绍了“C#中Lambda表达式如何使用”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!一、介绍"Lambda表达式&quo...
    99+
    2023-06-30
  • C# Lambda表达式怎么用
    这篇文章主要为大家展示了“C# Lambda表达式怎么用”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“C# Lambda表达式怎么用”这篇文章吧。C#语言还是比较常见的东西,这里我们主要介绍C#...
    99+
    2023-06-17
  • 关于java中的Lambda表达式的详细介绍
    什么是lambda表达式?lambda表达式是一个可传递的代码块,可以在后面执行一次或多次。推荐java相关视频教程:java学习视频例如:class action implements ActionListener{ @Override...
    99+
    2016-04-10
    java入门 java lambda表达式
  • Java8深入学习系列(一)lambda表达式介绍
    前言最近在学习java8,所以接下来会给大家介绍一系列的Java8学习内容,那么让我们先从lambda表达式开始。众所周知从java8出现以来lambda是最重要的特性之一,它可以让我们用简洁流畅的代码完成一个功能。 很长一段时间java被...
    99+
    2023-05-31
    java8 lambda表达式 ava
  • C++Lambda表达式详解
    目录概述语法分析捕获列表关键字声明示例捕获列表按值传递总结概述 C++ 11 中的 Lambda 表达式用于定义并创建匿名的函数对象,以简化编程工作。Lambda 的语法形式如下: ...
    99+
    2022-11-12
    C++表达式 C++Lambda表达式
  • C++11中lambda表达式如何使用
    本篇文章为大家展示了C++11中lambda表达式如何使用,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。首先这个lambda就是罗马字母λ,lambda表达式即λ表达式。数学上有一个概念叫λ演算,其...
    99+
    2023-06-19
  • C++11的lambda表达式怎么使用
    这篇文章主要讲解了“C++11的lambda表达式怎么使用”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“C++11的lambda表达式怎么使用”吧!可变lambda假设有如下vector,保...
    99+
    2023-06-19
  • C#中Lambda表达式的用法
    从C#3.0开始,可以使用lambda表达式把实现代码赋予委托。lambda表达式与委托(https://www.jb51.net/article/244051.htm)直接相关。当...
    99+
    2022-11-13
    C# Lambda表达式
  • C++中的Lambda表达式及表达式语句
    目录一、概念二、左值与右值三、类型转换四、操作符五、思考1、思考下面x变量是左值还是右值,有什么特性?2、思考一下以下赋值操作符的原始代码是怎样的?3、思考以下代码做了什么事情?一、...
    99+
    2022-11-12
    C++中的Lambda表达式 C++表达式语句 C++表达式
  • java8中的lambda表达式简介
    目录Lambda表达式的语法Lambda表达式作用域方法引用指向静态方法的方法引用指向任意类型实例方法的方法引用指向现有对象的实例方法的方法引用构造方法引用lambda与匿名内部类匿...
    99+
    2022-11-13
    java8 lambda表达式 java8 lambda
  • C++实例详解lambda表达式的使用
    目录lambda表达式1、lambda表达式语法2、lambda应用3、lambda表达式的应用实践1、计算器案例2、智能指针案例3、优先级队列lambda表达式 C++11 函数对...
    99+
    2022-11-13
    C语言lambda表达式 C语言lambda
  • C++11中的lambda表达式怎么使用
    本篇内容介绍了“C++11中的lambda表达式怎么使用”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!可调用对象对于一个表达式e,如果可以编...
    99+
    2023-06-19
  • C++精要分析lambda表达式的使用
    目录引言语法与示例捕获列表捕获引用特殊用法实现原理应用引言 C++要走向现代语言,如果不支持lambda表达式,你很难认为这门语言和现代有什么关系。幸好,从C++11标准起,它就实现...
    99+
    2022-11-13
    C++lambda表达式 C++lambda表达式作用
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作