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. JuiceFS 用户必备的 6 个技巧

    随着大数据.AI 技术的发展,越来越多的企业.团队和个人开始使用 JuiceFS,本文整理了 6 个超实用的 JuiceFS 技巧,帮助大家提升 JuiceFS 的管理效率. 一.查看已挂载的文件系统 ...

  2. mysql--基础管理

    1.docker环境登录mysql PS C:\WINDOWS\system32> docker ps -aCONTAINER ID IMAGE COMMAND CREATED STATUS P ...

  3. 详细一些的vue生命周期

    如果你和我一样,以前对vue生命周期的理解仅限于生命周期钩子,那么本文可以让我们更深入一层,理解vue在生命周期各个阶段所做的事,对我们对vue的理解和使用很有好处. (1)通过new Vue()创建 ...

  4. [USACO2022OPENS] Visits

    题目描述 Bessie 的 \(N\)(\(2\le N\le 10^5\))个奶牛伙伴(编号为 \(1\cdots N\))每一个都拥有自己的农场.对于每个 \(1\le i\le N\),伙伴 i ...

  5. Vue2.0 学习 第二组 语法模板

    本笔记主要参考菜鸟教程和官方文档编写. 1.文本绑定 一般在dom中用{{}}标时,并且在vue构造体内的data中定义文本内容 <div id="app">    & ...

  6. jenkins pipeline语法、自动生成、部署案例

    Jenkins Pipeline是一套插件,支持在Jenkins中实现持续集成和持续交付: pipeline的编写都要写入到一个名为Jenkinsfile的文件中. 流水线脚本管理 Jenkinsfi ...

  7. Pulsar3.0 升级指北

    Pulsar3.0 介绍 Pulsar3.0 是 Pulsar 社区推出的第一个 LTS 长期支持版本. 如图所示,LTS 版本会最长支持到 36 个月,而 Feature 版本最多只有六个月:类似于 ...

  8. ASR项目实战-构建Kaldi

    准备工作 安装构建时依赖的基础软件 软件清单如下: bzip2 python3 automake libtool cmake gcc g++ gfortran git subversion 不同平台安 ...

  9. Codeforce Round 916(div3)

    Codeforces Round 916(div3) [Problem - A - Codeforces]:Problemsolving Log A.题 直接看样例进行分析,发现每一次出现的字符代表着 ...

  10. Python——第五章:csv模块

    未来我们会使用爬虫获取到一些json文件,例如去英雄联盟官方爬取英雄的数据库 查看代码 {"hero":[{"heroId":"1",&qu ...