Lambda 听起来非常的牛逼,很容易就会联想到函数式编程或者 Lambda 演算这样的东西。但是在 C++里,没那么复杂,就把它当匿名函数用就好了

HelloWorld

对于降序排序,我们可以这样写(难道 greater 不好吗)

int arr[] = {2, 4, 5, 0, 3, 1};
sort(arr, arr + 6, [](int a, int b) { return a > b; });

按值捕获

在 Lambda 函数中,如果想要访问变量,就需要用到变量捕获

我们把想要捕获的东西写在 Lambda 的中括号里,然后函数体里就能直接使用这些变量了

下面给个示范代码

int num = 233;
auto func = [num]() { printf("%d\n", num); };
func();

执行后发现终端输出了 233

但需要注意的是,这里只是捕获了 num 的值,相当于拷贝了一份 num

在 Lambda 里也无法对 num 进行修改,原本的 num 这个局部变量也不会变化

如果想要在 Lambda 里修改 num 这个局部变量,就要捕获它的引用

按引用捕获

能够捕获到变量的引用

看代码就完事了

int num = 233;
auto func = [&num]() { num++; };
func();
printf("%d\n", num);

看到终端里输出了 234,num 的值被修改了

悬空引用

C++跟某些高级语言不一样,捕获引用的时候真的就只是捕获变量的引用。如果变量被销毁,Lambda 里捕获到的引用就失效了

举个例子(危险操作请勿效仿)

auto getFunc() {
string str = "Boomb!";
auto res = [&str]() { printf("%s\n", str.c_str()); };
res();
return res;
} int main() {
auto func = getFunc();
func();
return 0;
}

这个字符串在函数退出之前都是正常的,第一次调用 Lambda 也是正常的,但是函数退出之后这个字符串就被销毁了,因此在 main 里调用这个 Lambda 函数会爆炸

初始化捕获

C++14 的特性,可以捕获经过处理的变量,捕获类型由编译器自动推断,能使代码更加简洁

举个例子

int a = 1, b = 3;
auto func = [sum = a + b]() { printf("%d\n", sum); };
func();

捕获成员变量

如果需要捕获成员变量,需要在捕获列表中使用 this

不跟他多逼逼,看代码

struct Test {
int num;
Test(int num) : num(num) {}
auto GetFunc() {
return [this]() { printf("%d\n", num); };
}
}; int main() {
Test t = Test(233);
auto func = t.GetFunc();
func();
return 0;
}

捕获全部变量

Lambda 函数有个蛇皮操作,可以捕获所有的变量。在捕获列表里用=和&分别表示按值和按引用捕获全部变量

举个例子

int a = 1, b = 3;
auto func = [=]() { printf("%d %d\n", a, b); };
func();

但是出于安全性和可维护性的考虑不建议使用这两个东西

C++ Lambda 快速上手的更多相关文章

  1. 快速上手如何使用FluentData

    http://blog.itpub.net/29511780/viewspace-1194048/ 目录:  一.什么是ORM? 二.使用ORM的优势 三.使用ORM的缺点 四.NET下的ORM框架有 ...

  2. Java 程序员快速上手 Kotlin 11 招

    欢迎大家关注腾讯云技术社区-博客园官方主页,我们将持续在博客园为大家推荐技术精品文章哦~ 作者:霍丙乾 近经常会收到一些 "用 Kotlin 怎么写" 的问题,作为有经验的程序员, ...

  3. 快速上手 Kotlin 的 11 招

    本文转载自 Kotlin 公众号(KotlinX) 作者:bennyhuo 最近经常会收到一些 "用 Kotlin 怎么写" 的问题,作为有经验的程序员,我们已经掌握了一门或者多门 ...

  4. Java 程序员快速上手 Kotlin 11招

    收录待用,修改转载已取得腾讯云授权 作者 | 霍丙乾 编辑 | 迷鹿 前言 最近经常会收到一些 "用 Kotlin 怎么写" 的问题,作为有经验的程序员,我们已经掌握了一门或者多门 ...

  5. Markdown快速上手指南

    Markdown快速上手指南 1.Markdown介绍 markdown可以实现快速html文档编辑,格式优没,并且不需要使用html元素. markdown采用普通文本的形式,例如读书笔记等易于使用 ...

  6. Pandas快速上手(一):基本操作

    本文包含一些 Pandas 的基本操作,旨在快速上手 Pandas 的基本操作. 读者最好有 NumPy 的基础,如果你还不熟悉 NumPy,建议您阅读NumPy基本操作快速熟悉. Pandas 数据 ...

  7. java8-Stream集合操作快速上手

    java8-Stream集合操作快速上手   目录 Stream简介 为什么要使用Stream 实例数据源 Filter Map FlatMap Reduce Collect Optional 并发 ...

  8. 三分钟快速上手TensorFlow 2.0 (上)——前置基础、模型建立与可视化

    本文学习笔记参照来源:https://tf.wiki/zh/basic/basic.html 学习笔记类似提纲,具体细节参照上文链接 一些前置的基础 随机数 tf.random uniform(sha ...

  9. 快速上手pandas(上)

      pandas is a fast, powerful, flexible and easy to use open source data analysis and manipulation to ...

  10. 【Python五篇慢慢弹】快速上手学python

    快速上手学python 作者:白宁超 2016年10月4日19:59:39 摘要:python语言俨然不算新技术,七八年前甚至更早已有很多人研习,只是没有现在流行罢了.之所以当下如此盛行,我想肯定是多 ...

随机推荐

  1. Postgresql——jsonb类型

    Postgresql Json 最近有个功能,需要用到 NoSQL 数据库.但是又不想因为这个小小的功能给系统增加一个 MongoDB 数据库,于是就想到了 Postgresql 支持 JSON 类型 ...

  2. Walrus 0.4发布:单一配置、多态运行,体验下一代应用交付模型

    今天,我们高兴地宣布云原生统一应用平台 Walrus 0.4 正式发布,这是一个里程碑式的版本更新.新版本采用了全新的应用模型--仅需进行单一配置,即可在多种模态的基础设施及环境中运行包括应用服务及周 ...

  3. 数据集成平台关于【源平台调度&任务生命周期】

    任务调度者 调度事件 生产任务 调度任务池-异步
AsynDispatcher --source 实例化适配器执行 消费任务 实例化集成应用 DataHub Instance
handleSource ...

  4. 【死亡小学期第二章:没头脑和不高兴】数据库jdbc系统

    自己做一个JDBC的数据库系统,因为这个一直做嘛,所以很简单啦,并没有想提高技术拔拔高啥的,就想做一个简单的,然后自己感兴趣的内容.让自己快乐快乐那才叫做意义~~~~~~~kkkk 学到的东西: 展示 ...

  5. 【LOJ NOI Round#2 Day1 T1】单枪匹马(矩阵乘法)

    题目传送门 操作二要求的东西是一个循环迭代的东西,手推相邻两项找下规律,发现相邻两项的分子分母间含有线性关系,考虑用矩阵乘法求解.对于 \([1,n]\)的询问,从后往前倒推, \(x_{n-1}=a ...

  6. AutoCAD ObjectARX 二次开发(2020版)--4,使用ARX向导创建CAD二次开发项目(编程框架)--

    手动创建ObjectARX应用程序非常麻烦,在此步骤中,将介绍ObjectARX向导. 在这里,我们将使用ObjectARX向导创建我们的ObjectARX应用程序. 本节的程序的需求是,接收CAD用 ...

  7. 火山引擎DataTester升级MAB功能,助力企业营销决策

    更多技术交流.求职机会,欢迎关注字节跳动数据平台微信公众号,回复[1]进入官方交流群 DataTester,火山引擎推出的 AB 测试与智能优化平台,近日宣布对其 MAB(Multi-armed Ba ...

  8. Bert-vits2新版本V2.1英文模型本地训练以及中英文混合推理(mix)

    中英文混合输出是文本转语音(TTS)项目中很常见的需求场景,尤其在技术文章或者技术视频领域里,其中文文本中一定会夹杂着海量的英文单词,我们当然不希望AI口播只会念中文,Bert-vits2老版本(2. ...

  9. ElasticSearch之Slow Log

    ElasticSearch的慢日志,相关的参数及配置方法. 在log4j2.properties中配置慢日志的输出文件名. Search Slow Log 相关参数 index.search.slow ...

  10. go的html模板template格式化时间

    go的html模板template格式化时间 go的html模板template格式化时间,网上一搜挺尴尬找不到想要的yyyy-MM-dd HH:mm:ss // 代码中是这样的 //2021-09- ...