Lambda

C++11 中 lambda 是一个匿名函数对象

最简形式

[]{
cout << "lambda" << endl;
}(); // print "lambda" auto l = []{
cout << "lambda" << endl;
};
...
l(); // print "lambda"

完整形式

[...](...) mutable throwSpec ->retType {...}

[...]:lambda 引入符,捕获 non-static 外部变量

  [] 不捕获外部变量

  [=] 传值

  [&] 传引用

  [x, &y] x 传值,y 传引用

  [=, &x] x 传引用,其余变量传值(尽量不这样写默认情况,而是全部列出,增加代码可读性)

(...):形参列表,若含以下可选参数之一,即使无形参,也必须加上 ()

可选参数

mutable:关键字,表明传入的外部变量在函数内可改动。若传值捕获外部变量,再加上 mutable 关键字,表明函数内变量可改动,但不会影响函数外该变量的值。

throwSpec:异常处理

->retType:lambda 的返回类型

{...}:函数体,函数体内可声明 static / non-static 变量,可返回数值

例子

 int main() {
int id = ;
auto f = [id]() mutable {
cout << "f() id: " << id << endl;
++id;
};
id = ;
f(); // print "f() id: 0"
f(); // print "f() id: 1"
f(); // print "f() id: 2"
cout << "id: " << id << endl; // print "id: 99"
return ;
}

注意:

1、编译器看到第 3 行的时候,id = 0,由于传值,所以函数内 id = 0

2、若不写 mutable,则 ++id 编译报错 “cannot assign a variable captured by copy in a non-mutable lambda”

3、若 id 定义为 static,则 static int id = 0 编译报错 “id cannot be captured because it does not have automatic storage duration(静态存储周期)”

比较(传引用)

 int main() {
int id = ;
auto f = [&id]() mutable {
cout << "f() id: " << id << endl;
++id;
};
id = ;
f(); // print "f() id: 99"
f(); // print "f() id: 100"
f(); // print "f() id: 101"
cout << "id: " << id << endl; // print "id: 102"
return ;
}

比较(有形参)

 int main() {
int id = ;
auto f = [id](int p) {
cout << "f() id: " << id << " p: " << p << endl;
++p;
};
id = ;
f(id); // print "f() id: 0 p: 99"
f(); // print "f() id: 0 p: 7"
cout << "id: " << id << endl; // print "id: 99"
return ;
}

声明一个 lambda 对象,需要使用 template 或 auto。

如果需要 lambda 对象的类型,需要使用 decltype(),例如,将 lambda 作为哈希函数或排序准则,传给一个关联容器或无序容器时。

auto cmp = [](const Person& p1, const Person& p2) {
return p1.lastname < p2.lastname ||
(p1.lastname == p2.lastname && p1.lastname < p2.lastname);
}
...
std::set<Person, decltype(cmp)> coll(cmp); // set的声明需要cmp的类型

这里必须使用 cmp 作为 set 构造函数的参数,否则编译器会尝试调用 cmp 对象的默认构造函数并报错。

注意,虽然 lambda 是一个函数对象,但无法为其设计默认构造函数和赋值操作。

【C/C++】C++11 Lambda的更多相关文章

  1. 【正则表达式1】C++11正则表达式

    https://www.cnblogs.com/pukaifei/p/5546968.html [正则表达式1]C++11正则表达式   头文件 #include <regex> rege ...

  2. 【读书笔记】2016.11.19 北航 《GDG 谷歌开发者大会》整理

    2016.11.19 周六,我们在 北航参加了<GDG 谷歌开发者大会>,在web专场,聆听了谷歌公司的与会专家的技术分享. 中午免费的午餐,下午精美的下午茶,还有精湛的技术,都是我们队谷 ...

  3. 【编程篇】C++11系列之——临时对象分析

    /*C++中返回一个对象时的实现及传说中的右值——临时对象*/ 如下代码: /**********************************************/ class CStuden ...

  4. 【机器学习实战】第11章 使用 Apriori 算法进行关联分析

    第 11 章 使用 Apriori 算法进行关联分析 关联分析 关联分析是一种在大规模数据集中寻找有趣关系的任务. 这些关系可以有两种形式: 频繁项集(frequent item sets): 经常出 ...

  5. 【STM32H7教程】第11章 STM32H7移植SEGGER的硬件异常分析

    完整教程下载地址:http://forum.armfly.com/forum.php?mod=viewthread&tid=86980 第11章       STM32H7移植SEGGER的硬 ...

  6. 【python深入】map/reduce/lambda 内置函数的使用

    python中的内置函数里面,有map和reduce两个方法,这两个方法可以非常好的去做一些事情,但是之前都没有用过,下面是关于这两个方法的介绍: 一.map相关 map()会根据提供的函数对指定的序 ...

  7. 【大数据】大数据处理-Lambda架构-Kappa架构

    大数据处理-Lambda架构-Kappa架构 elasticsearch-head Elasticsearch-sql client NLPchina/elasticsearch-sql: Use S ...

  8. 【转帖】iPhone 11 Pro Max皇帝版物料成本不足3500元 卖一赚二

    iPhone 11 Pro Max皇帝版物料成本不足3500元 卖一赚二 https://www.cnbeta.com/articles/tech/894449.htm 供应链的掌控力很重要 苹果今年 ...

  9. 【python基础】第11回 数据类型内置方法 02

    本章内容概要 列表内置方法 字典内置方法 元组内置方法 集合内置方法 可变类型与不可变类型 本章内容详细 1.列表内置方法 list 列表在调用内置方法之后不会产生新的值 1.1 统计列表中的数据值的 ...

随机推荐

  1. OSM自建服务

    1.  安装PostgreSQL. 2.  安装PostGis(安装目录为PostgreSQL目录). 3.  安装osm2pgsql. osm2pgsql下载地址:http://customdebu ...

  2. linux用户键拷贝文件

    如果A用户没有权限写B用户下面的文件,可以用这个命令拷贝 scp AAA.tar.gz B用户名@IP:全路径

  3. XPosed 示例

    https://blog.csdn.net/fmc088/article/details/80535894

  4. 服务器硬件与linux系统

    服务器的特性: 高速度的CPU运算能力 长时间的可靠运行 强大的I/O外部数据吞吐能力 服务器通常具有更高的性能,效率,高可靠,高可用性,以及更好的扩展性. 服务器的分类 (1)服务器按外形分类 塔式 ...

  5. .net 中写 psql 匿名函数、过程语言

    DO --关键字 $serch$ --$中间随便写, 不能用特殊符号和数字好像$ DECLARE times integer; --定义变量 rec history_depart%ROWTYPE; - ...

  6. python generator用法

    转自:https://www.liaoxuefeng.com/wiki/001374738125095c955c1e6d8bb493182103fac9270762a000/0013868196510 ...

  7. 【题解】Luogu P2221 [HAOI2012]高速公路

    原题传送门 这道题还算简单 我们要求的期望值: \[\frac{\sum_{i=l}^r\sum_{j=l}^rdis[i][j]}{C_{r-l+1}^{2}}\] 当然是上下两部分分别求,下面肥肠 ...

  8. SQL语句——exists和in区别

    表结构及数据 user表 order表 in select * from table A where id in (xxxxxxxxxxx):满足条件的数据会被查出来: 先查询子查询的表,然后将内表. ...

  9. 设计模式理解(十)结构型——享元(Flyweight)

    最后一个结构型,享元.没有太多的项目经验,对这种模式只有一种概念上的理解,就是为了节约内存等资源,把可重用的东西只申请一次,然后处处调用,同时用Hash进行管理. 直接上图: 代码: /******* ...

  10. NOIP 2017 逛公园 - 动态规划 - 最短路

    题目传送门 传送门 题目大意 给定一个$n$个点$m$条边的带权有向图,问从$1$到$n$的距离不超过最短路长度$K$的路径数. 跑一遍最短路. 一个点拆$K + 1$个点,变成一个DAG上路径计数问 ...