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. Ubuntu 20.04 查看内存信息

    输入命令 dmidecode -t memory 输出如下: # dmidecode 3.2 Getting SMBIOS data from sysfs. SMBIOS 2.8 present. H ...

  2. HBuilderx 创建 、运行uniapp项目

    uni-app官网介绍的 通过 HBuilderX 可视化界面 跟着小颖来创建一个自己的小程序 创建小程序 依次点击HBuilderx 左上方的按钮:文件->新建->项目 然后打开该界面, ...

  3. 【python】【报错:pip中第三库下载成功,但是pycharm却没有显示】一步解决

    解决方案: 直接在这个目录下安装第三方库

  4. [FJOI2017]矩阵填数 (容斥原理)

    题目传送门 现在看来熊猫杯的J题原来是个容斥套路题,按照值域排序后根据值域划分方块数,枚举子集容斥计算即可. #include<cstdio> #include<algorithm& ...

  5. [ABC246D] 2-variable Function

    Problem Statement Given an integer $N$, find the smallest integer $X$ that satisfies all of the cond ...

  6. 自定义一个简单的SpringBoot-Starter

    1.创建一个简单的maven项目 2.导入相关依赖 <dependencies> <!--核心场景启动器,包含Spring的核心功能--> <dependency> ...

  7. HDU-3591 混合背包

    The trouble of Xiaoqian Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/ ...

  8. bash shell笔记整理——which和whereis命令

    which和whereis命令作用 which:显示给定命令所在路径 whereis:相比which更完善,显示命令路径.man文件路径(如果有).源代码路径 which语法 which [optio ...

  9. 专业的字节码查看工具——jclasslib

    下载地址: GitHub地址:点击下方蓝色链接即可. https://github.com/ingokegel/jclasslib/releases/download/6.0.4/jclasslib_ ...

  10. ElasticSearch之Nodes info API

    查看当前集群中各节点的信息,执行如下命令: curl -X GET "https://localhost:9200/_nodes?pretty" --cacert $ES_HOME ...