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. CSS制作渐变背景色

    <style type="text/css"> #grad1 { background: -webkit-linear-gradient(#C2F2F0,#); /* ...

  2. (转)sql 违反了 PRIMARY KEY 约束,不能在对象 中插入重复键

    说明你的数据里面有重复记录 两种情况 1.已存在的表中和要导入数据之间的重复 这个时候可以通过在两个表之间建立关联,将主键级联找出重复记录 2.要导入的表中存在重复记录 可通过类似如下的语句将表中的重 ...

  3. linux 运行级别 & 虚拟控制台

     7 个运行级别 #-停机(千万不要把initdefault设置为0) #-单用户模式 #-多用户,没有NFS #-完全多用户模式(标准的运行级) #-没有用到 #-X11(xwindow) #-重新 ...

  4. (Review cs231n) Spatial Localization and Detection(classification and localization)

     重在图像的定位和检测的内容. 一张图片中只有一种给定类别标签的对象,定位则是图像中有对象框:再这些类中,每一个训练目标都有一个类和许多的图像内部对应类的位置选框. 猜想的仅是类标签,不如说它们是位置 ...

  5. 转--Python re模块 验证11位手机号

      一.常用正则表达式符号和语法:   '.' 匹配所有字符串,除\n以外 ‘-’ 表示范围[0-9] '*' 匹配前面的子表达式零次或多次.要匹配 * 字符,请使用 \*. '+' 匹配前面的子表达 ...

  6. .NET 常用ORM之NHibernate

    NHibernate做.Net应该都不陌生,今天我们就算是温故下这个技术,概念性的东西就不说了,这次主要说本人在实际使用的遇到的问题,比较费解现在就当是记录下,避免以后再犯.本次主要使用的情况是1对N ...

  7. [WDS] Warnings while compiling. vue 项目运行控制台输出太多警告信息

    vue项目运行控制台输出太多警告信息,我们需要vue 忽略警告, 解决方法:找到build/webpack.base.conf.js  文件 注释掉: // ...(config.dev.useEsl ...

  8. 2.4JAVA基础复习——JAVA语言的基础组成数组

    JAVA语言的基础组成有: 1.关键字:被赋予特殊含义的单词. 2.标识符:用来标识的符号. 3.注释:用来注释说明程序的文字. 4.常量和变量:内存存储区域的表示. 5.运算符:程序中用来运算的符号 ...

  9. leetcode 1——两数之和

    问题描述 给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标. 你可以假设每种输入只会对应一个答案.但是,你不能重复利用这个数组 ...

  10. IDEA启动项目内存溢出

    一.java.lang.OutOfMemoryError: Java heap space 1.在tomcat设置界面  VM options添加参数 -server -XX:PermSize=512 ...