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. MySQL-管理员root@'locahost' 丢失,怎么处理?

    版权声明:原创作品,谢绝转载!否则将追究法律责任. ----- 作者:kirin 跳过授权表 ----> 不开启验证功能(无密码登录) --skip-grant-tables 阻止所有tcp/i ...

  2. 七天.NET 8操作SQLite入门到实战 - 第五天引入SQLite-net ORM并封装常用方法(SQLiteHelper)

    前言 上一章节我们搭建好了EasySQLite的前后端框架,今天我们的主要任务是在后端框架中引入SQLite-net ORM并封装常用方法(SQLiteHelper). 七天.NET 8操作SQLit ...

  3. 如何使用 PreparedStatement 来避免 SQL 注入,并提高性能?

    前言 本篇文章主要如何使用 PreparedStatement 来避免 SQL 注入,并提高性能? 欢迎点赞 收藏 留言评论 私信必回哟 博主将持续更新学习记录收获,友友们有任何问题可以在评论区留言 ...

  4. 不会这5个Excel函数,别说你会做数据分析?

    当涉及数据分析时,Excel是一个非常有用的工具,而掌握一些核心函数将大大提高你在数据处理和分析方面的能力.以下是我对五个重要的Excel函数的详细介绍: 1. VLOOKUP 函数 VLOOKUP ...

  5. 数据分析工具 Datainside、Power BI、帆软(FineReport)怎么选?

    Datainside.Power BI和帆软(FineReport)都是数据分析领域常用的工具,它们各自有不同的特点和适用场景.下面将会详细介绍每个工具的功能和优势,以便您进行选择. Datainsi ...

  6. Rong晔大佬教程学习(2):取指

    1.rvseed_defines.v(定义了一些参数,没有实际意义) 该文件定义了一些基本参数,在后续的代码中都会调用该文件 // simulation clock period `define SI ...

  7. SpringBoot-Validate优雅的实现参数校验,详细示例~

    1.是什么? 它简化了 Java Bean Validation 的集成.Java Bean Validation 通过 JSR 380,也称为 Bean Validation 2.0,是一种标准化的 ...

  8. 如何给图数据库 NebulaGraph 新增一种数据类型,以 Binary 为例

    NebulaGraph 内核所自带的数据结构其实已经很丰富了,比如 List.Set.Map.Duration.DataSet 等等,但是我们平时在建表和数据写入的时候,可以用到的数据结构其实比较有限 ...

  9. 文档理解的新时代:LayOutLM模型的全方位解读

    一.引言 在现代文档处理和信息提取领域,机器学习模型的作用日益凸显.特别是在自然语言处理(NLP)技术快速发展的背景下,如何让机器更加精准地理解和处理复杂文档成为了一个挑战.文档不仅包含文本信息,还包 ...

  10. mac如何访问同一wifi下的项目-mac-ru-he-fang-wen-tong-yi-wifi-xia-de-xiang-mu

    title: mac如何访问同一wifi下的项目 date: 2022-03-28 20:14:06.341 updated: 2022-03-28 21:55:42.53 url: https:// ...