【C++11】Lambda表达式

前言

上文我们学习了C++11新语法,可变参数模板以及用可变参数模板作为形参的emplace接口。【C++11】可变参数模板-CSDN博客

本文我们来学习C++11下一个新语法,Lambda表达式。

1.Lambda表达式语法

Lambda表达式本质是一个匿名函数对象,与普通函数不同,它可以定义在函数内部。

Lambda表达式在语法使用层是没有类型可言的,所以我们一般用auto或者模板定义的对象去接收Lambda对象。

Lambda表达式的格式:

cpp 复制代码
[capture-list] (parameters)-> return type { function boby }

capture-list\]:捕捉列表。该列表出现在Lambda表达式的最前面,编译器正式通过 \[\] 来判断我们所写的代码是否为Lambda表达式。捕捉列表可以捕捉变量供给Lambda表达式使用。捕捉的变量具体分为两类:值捕捉,引用捕捉。捕捉列表不能省略,即使没有捕捉的变量也不能。 (parameters):参数列表。与普通函数的参数列表功能类似,如果不需要传参,可以连同()一起省略。 -\>return type:返回值类型。与普通函数的返回值类型一样,当没有返回值时可省略。但是值得注意的是,一般情况下也会省略,直接让编译器自动推导返回值类型。 {function boby}:函数体。与普通函数的函数体类似。不可省略。 以下是简单Lambda表达式样例:![](https://i-blog.csdnimg.cn/direct/a40f4252322f440e84439e1e7449a8ae.png) ```cpp #include using namespace std; //简单Lambda表达式样例 int main() { //样例1 auto add = [](int x, int y) ->int { return x + y; }; cout << add(1, 2)< #include #include using namespace std; struct Goods { Goods(string name,double price,int evaluate) :_name(name) ,_price(price) ,_evaluate(evaluate) {} string _name; // 名字 double _price; // 价格 int _evaluate; // 评分 }; //价格升序 struct PriceCompare { bool operator()(const Goods& a, const Goods& b) { return a._price > b._price; } }; int main() { vector v = { { "苹果", 2.1, 5 }, { "香蕉", 3, 4 }, { "橙子", 2.2, 3}, { "菠萝", 1.5, 4 } }; //类似这样的场景,若要实现仿函数对象或者函数指针来支持商品中不同项的比较,相对而言还是比较麻烦的。此时,Lambda 就非常实用了 sort(v.begin(), v.end(), PriceCompare()); //Lambda表达式 sort(v.begin(), v.end(), [](const Goods& a, const Goods& b) {return a._price > b._price;}); } ``` ## 4.Lambda表达式原理 Lambda的原理和范围for很像,编译转化为底层代码后根本没有范围for这个东西的存在,其底层加上迭代器。同样的Lambda仅仅是语法层面的,其底层是仿函数。也就是说我们在实现一个Lambda表达式,本质其实是实现一个仿函数。 仿函数的类名是编译器按照一点规则生成的(按照uuid规则生成的),这保证了不同的Lambda的类名基本不会重复。Lambda的参数/函数体/返回值类型加上仿函数的参数/函数体/返回值类型。Lambda捕捉列表的本质就是生成仿函数的成员变量,也就是说捕捉列表的变量是仿函数的构造函数的实参,当隐式捕捉时,编译器看需要使用那些变量就传那些变量。 以上就是本文全部内容,大佬点个赞再走吧![](https://i-blog.csdnimg.cn/direct/9763aa87218848fd88172c5ae8110ebf.jpeg)

相关推荐
逼子格9 分钟前
硬件工程师笔记——二极管Multisim电路仿真实验汇总
笔记·嵌入式硬件·硬件工程师·multisim·硬件工程师学习·电子器件·电路图
海绵宝宝贾克斯儿25 分钟前
C++中如何实现一个单例模式?
开发语言·c++·单例模式
史迪仔011226 分钟前
[python] Python单例模式:__new__与线程安全解析
开发语言·python·单例模式
Epiphany.55629 分钟前
素数筛(欧拉筛算法)
c++·算法·图论
龙湾开发31 分钟前
计算机图形学编程(使用OpenGL和C++)(第2版)学习笔记 10.增强表面细节(二)法线贴图
c++·笔记·学习·图形渲染·贴图
whoarethenext41 分钟前
c/c++的opencv的轮廓匹配初识
c语言·c++·opencv
爱吃涮毛肚的肥肥(暂时吃不了版)42 分钟前
项目班——0510——JSON网络封装
c++·算法·json
isyangli_blog1 小时前
(1-4)Java Object类、Final、注解、设计模式、抽象类、接口、内部类
java·开发语言
apocelipes1 小时前
使用libdivide加速整数除法运算
c语言·c++·性能优化·linux编程
liang_20261 小时前
【HT周赛】T3.二维平面 题解(分块:矩形chkmax,求矩形和)
数据结构·笔记·学习·算法·平面·总结