返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >C++详细分析lambda表达式的本质
  • 375
分享到

C++详细分析lambda表达式的本质

2024-04-02 19:04:59 375人浏览 安东尼
摘要

例: stable_sort(Words.begin(), words.end(), [](const string& s1, const string& s2

例:

stable_sort(Words.begin(), words.end(), 
		[](const string& s1, const string& s2) 
		{ return s1.size() < s2.size(); });
class ShorterString 
{
public:
	bool operator()(const string& s1,const string& s2)const
	{
		return s1.size() < s2.size();
	}
};
// 等价于
stable_sort(words.begin(), words.end(), ShorterString();
// 或者
ShorterString s;
stable_sort(words.begin(), words.end(), s;

写一个lambda表达式之后,编译器将该表达式翻译为一个未命名类的未命名对象。

且lambda表达式产生的类中含有一个重载的函数调用运算符。且该函数调用运算符成员的形参列表和函数体与lambda表达式完全一样。

此时,stable_sort的内部代码每次比较两个string时就会"调用"这一对象。此对象将会调用运算符的函数体,返回true or false

我们知道,lambda表达式可以捕获变量,且分为引用捕获和值捕获,而当引用捕获时,由程序负责确保lambda执行时引用所引的对象确实存在,而编译器就会直接使用该引用,无需在lambda产生的类中将其存储为数据成员

根据上一段话的介绍,大致也可以猜想出,若采用值捕获的方式,被值捕获的变量会被拷贝至lambda中。因此,这种lambda产生的类必须为每个值捕获的变量创建对应的数据成员。 同时创建构造函数。令其使用捕获的变量的值来初始化数据成员。

默认情况下lambda表达式不可以改变它捕获的变量。所以重载函数调用运算符的函数默认情况下会被定义为const。

举例:

auto wc = find_if(words.begin(), words.end(), 
    [sz] (const string& s) { return s.size() >= sz; } );
class Sizecomp
{
public:
	Sizecomp(size_t n) :sz(n) {}
	bool operator()(const string& s)const
	{
		return s.size() >= sz;
	}
private:
	size_t sz;
};
// 等价于
auto wc = find_if(words.begin(), words.end(), Sizecomp(sz));

此类无默认构造函数,因此要想使用这个类必须提供一个实参。数据成员sz对应通过值捕获的变量。用此值捕获变量的值来初始化该sz数据成员。

c++11中, lambda是通过匿名的函数对象来实现的,因此我们可以把lambda看作是对函数对象在使用方式上进行的简化。

当代码需要一个简单的函数,并且这个函数并不会在其他地方被使用时,就可以使用lambda来实现,此时它所起的作用类似于匿名函数。 但如果这个函数需要多次使用,并且它需要保存某些状态的话,使用函数对象则更合适一些。

练习:编写程序,统计一个vector<string>中元素size处于1-9的有几个,大于等于10的有几个

class StrLenBetween
{
public:
	StrLenBetween(int m, int x) :min(m), max(x) {}
	bool operator()(const string& s)const
	{
		return s.size() >= min && s.size() <= max;
	}
private:
	int min;
	int max;
};
void readStr(istream& is, vector<string>& v)
{
	string s;
	while (is >> s)
		v.push_back(s);
}
int main()
{
	vector<string> vec;
	readStr(cin, vec);
	const int min = 1;
	const int max = 10;
	cout << "len 1~9 : " << count_if(vec.begin(), vec.end(), [min, max](const string& s)->bool {return s.size() >= 1 && s.size() <= 9; }) << endl;
	cout << "len >= 10 : " << count_if(vec.begin(), vec.end(), [max](const string& s)->bool {return s.size() >= max; }) << endl;
	cout << "len 1~9 : " << count_if(vec.begin(), vec.end(), StrLenBetween(min, max)) << endl;
	return 0;
}

主函数第一个cout和第三个cout意义相同。

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

--结束END--

本文标题: C++详细分析lambda表达式的本质

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

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

猜你喜欢
  • C++详细分析lambda表达式的本质
    例: stable_sort(words.begin(), words.end(), [](const string& s1, const string& s2...
    99+
    2024-04-02
  • C# 本地函数与 Lambda 表达式详细介绍
    目录1、C# 本地函数与 Lambda 表达式2、Lambda 表达式3、本地函数4、那么,局部函数的目的是什么?1、C# 本地函数与 Lambda 表达式 C# 局部函数通常被视为...
    99+
    2024-04-02
  • C++Lambda表达式详解
    目录概述语法分析捕获列表关键字声明示例捕获列表按值传递总结概述 C++ 11 中的 Lambda 表达式用于定义并创建匿名的函数对象,以简化编程工作。Lambda 的语法形式如下: ...
    99+
    2024-04-02
  • C++精要分析lambda表达式的使用
    目录引言语法与示例捕获列表捕获引用特殊用法实现原理应用引言 C++要走向现代语言,如果不支持lambda表达式,你很难认为这门语言和现代有什么关系。幸好,从C++11标准起,它就实现...
    99+
    2024-04-02
  • 详细解读Java的Lambda表达式
    目录Lambda 表达式Lambada 简介简单的示例Lambda 表达式的组成部分函数式接口介绍几个 Java 中重要的函数接口Lambda 表达式 最早接触到 Lambda 表达...
    99+
    2023-05-14
    Java Lambda表达式 Lambda表达式
  • Java详细分析Lambda表达式与Stream流的使用方法
    目录LambdaStream流 Lambda        Lambda 表达式是一个匿名函数,我们可以把 lambda 表达式理解...
    99+
    2024-04-02
  • python lambda 表达式形式分析
    目录lambda表达式格式匿名的用法前言: 在日常开发的过程中,有时候会临时用到一些简单的函数,她们的业务逻辑会相对简单,简单到并不值得让他们留下名字,这个时候,就很值得使用匿名函数...
    99+
    2024-04-02
  • C#3.0中Lambda表达式详解
    在C#2.0中,微软给我们带来了一些新的特性,例如泛型,匿名委托等。然而,这些新的特性多多少少会给人一种从别的语言中“抄”来的感觉(例如泛型类似C++的模板,一些特性类似Java中的...
    99+
    2022-11-15
    C# Lambda
  • C++11 lambda(匿名函数)表达式详细介绍
    目录前言概念及基本用法捕获变量lambda表达式类型声明式的编程风格总结前言 Lambda(匿名函数)表达式是C++11最重要的特性之一,lambda来源于函数式编程的概念,也是现代...
    99+
    2024-04-02
  • Linq lambda表达式的示例分析
    小编给大家分享一下Linq lambda表达式的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!Linq lambda表达式了解过C# 3.0的新特性的话应...
    99+
    2023-06-17
  • Java的Lambda表达式实例分析
    这篇“Java的Lambda表达式实例分析”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Java的Lambda表达式实例分析...
    99+
    2023-06-29
  • Java实例分析Lambda表达式
    这篇文章主要介绍“Java实例分析Lambda表达式”,在日常操作中,相信很多人在Java实例分析Lambda表达式问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Java实例分析Lambda表达式”的疑惑有所...
    99+
    2023-06-30
  • C++中的Lambda表达式及表达式语句
    目录一、概念二、左值与右值三、类型转换四、操作符五、思考1、思考下面x变量是左值还是右值,有什么特性?2、思考一下以下赋值操作符的原始代码是怎样的?3、思考以下代码做了什么事情?一、...
    99+
    2024-04-02
  • Java中Lambda表达式的使用详细教程
    目录简介格式实例函数式接口lambda作为参数遍历集合创建线程排序简介 说明 本文用示例展示Lambda表达式的用法。同时也会介绍Lambda的相关知识。 Lambda表达式介绍 L...
    99+
    2024-04-02
  • Java中Lambda表达式使用详细解读
    目录前言一、Lambda表达式的简介二、Lambda表达式对接口的要求1.函数式接口2.@FunctionalInterface3.Lambda表达式的语法1.Lambda表达式的基...
    99+
    2023-05-18
    java  Lambda表达式使用 java  Lambda表达式 Lambda表达式使用
  • C++实例详解lambda表达式的使用
    目录lambda表达式1、lambda表达式语法2、lambda应用3、lambda表达式的应用实践1、计算器案例2、智能指针案例3、优先级队列lambda表达式 C++11 函数对...
    99+
    2024-04-02
  • Java的Lambda表达式使用实例分析
    这篇文章主要讲解了“Java的Lambda表达式使用实例分析”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Java的Lambda表达式使用实例分析”吧!Lambada 简介lambda 表达...
    99+
    2023-07-05
  • 关于java中的Lambda表达式的详细介绍
    什么是lambda表达式?lambda表达式是一个可传递的代码块,可以在后面执行一次或多次。推荐java相关视频教程:java学习视频例如:class action implements ActionListener{ @Override...
    99+
    2016-04-10
    java入门 java lambda表达式
  • C#表达式和运算符详细解析
    目录类型转换1、表达式1.2 运算符分类2、数学运算符3、赋值运算符4、关系运算符5、布尔运算符6、位运算符6.1 &按位与运算6.2 或|按位运算6.3 异或^按位运算符6...
    99+
    2024-04-02
  • C#中Lambda表达式的用法
    从C#3.0开始,可以使用lambda表达式把实现代码赋予委托。lambda表达式与委托(https://www.jb51.net/article/244051.htm)直接相关。当...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作