1. 定义

  • lambda表达式表示一个可调用的代码单元。
  • 一个lambda具有捕获列表、参数列表,返回类型,函数体:
    [capture list](parameter list)->return type{function body};

capture list是一个lambda表达式调用的、除了传入参数之外的其他变量列表(通常为空),意思是lamda捕获了被调用的函数中的变量拿来"自己用"。

eg.

auto f = [] {return 42;};
cout << f() << endl;stable_sort(words.begin(), words.end(),[] (const string &s1, const string &s2){  return s1.size() < s2.size();});
  • lamda传递参数时不能有默认参数

2. lambda捕获与返回
2.1 显式捕获

值捕获与引用捕获。

2.1.1 值捕获

前提是变量可以拷贝,与参数不同,被捕获的变量的值是在lambda创建时拷贝,而不是在调用时拷贝。

void func(){size_t v1 = 42;auto f = [v1]{ return v1;};v1 = 0;auto j = f(); //j = 42
}

2.1.2 引用捕获

eg1.

void func2(){size_t v1 = 42;auto f = [&v1]{ return v1;};v1 = 0;auto j = f(); //j = 0
}

eg2.

void static capture_hide() {vector<string> words = { "the", "quick", "red", "fox","red", "the","slow" };biggies(words, words.size(), std::cout, '_');
}//原版
void static biggies(std::vector<std::string>& words,std::vector<std::string>::size_type sz, ostream &os = cout, char c = ' ')
{  // print resultfor_each(words.begin(), words.end(), [&os, c](const std::string& s) {os << s << c; });
}
输出结果:
the_quick_red_fox_red_the_slow_
  • 不能引用局部变量
  • 从一个函数返回lamda,此lamda也不能包含引用捕获

2.2 隐式捕获

除了显式的列出我们我需要函数中那些变量,还可以用= 或 &,让编译器推断我们使用了那些变量。其中= 告诉编译器这些变量都是值捕获,& 告诉编译器这些变量都是引用捕获。

// sz采用隐式值捕获的方式
vector<string>::size_type sz;
auto wa = find_if(w.begin(), w.end(), [=](const string &s) {return s.size() >= sz;
});//隐式引用捕获
void print(vector<string> w, ostream &os=cout) {// os使用隐式引用捕获方式for_each(w.begin(), w.end(), [&] (const string &s) {os << s;});
}

2.3 混合使用隐式捕获和显式捕获

捕获列表第一个元素必须是一个&或=,并且显式捕获的变量必须采用与隐式捕获不同的方式。
对一部分变量采用值捕获,一部采用引用捕获,那么就可以混合使用隐式捕获和显式捕获。
eg.

[&,c]
[=,&os] //c 和os 都是来自函数的变量

eg.

void print(vector<string> w, ostream &os=cout, char c='a') {// os使用隐式引用捕获方式; c必须是显式的值捕获方式for_each(w.begin(), w.end(), [&, c] (const string &s) {os << s << c;});// c使用隐式值捕获方式; os必须是显式的引用捕获方式for_each(w.begin(), w.end(), [=, &os] (const string &s) {os << s << c;});
}

2. 可变lambda

在参数列表首加上关键字mutable,
eg. 如下代码不加mutable则编译出错!

void fcn3()
{size_t v1=42;//局部变量auto f=[v1]()mutable{return ++v1;};//f可以改变它所捕获的变量的值v1=0;auto j=f();//j为43
}

3. lambda表达式的返回类型

lambda表达式可以根据函数体返回结果自动推断类型,但是多数情况下无法自动推断,需要指定返回类型

auto f = [](int i) {// 取绝对值return i < 0 ? -i : i;
};

eg. lambda使用尾置返回来指定返回类型

auto f = [](int i)  -> int {// 取绝对值if (i < 0) return -i;elsereturn i;
};

C++ Primer 5th笔记(10)chapter10 泛型算法 :lambda相关推荐

  1. C++ Primer 学习笔记 第十章 泛型算法

    C++ Primer 学习笔记 第十章 泛型算法 336 find函数 #include <iostream> #include <vector> #include <s ...

  2. C++ Primer 5th笔记(10)chapter10 泛型算法 :泛型算法结构

    名称 定义 输入迭代器 只读,不写:单遍扫描,只能递增 输出迭代器 只写,不读:单遍扫描,只能递增 前向迭代器 可读写,多遍扫描,只能递增 双向迭代器 可读写,多遍扫描,可递增递减 随机访问迭代器 可 ...

  3. C++ Primer 5th笔记(10)chapter10 泛型算法 :迭代器

    迭代器类别 名称 定义 插入迭代器 这些迭代器被绑定到一个容器上,可用来向容器插入元素 流迭代器 这些迭代器被绑定到输入或输出流上,可用来遍历所有关联的IO流 反向迭代器 这些迭代器向后而不是向前移动 ...

  4. C++primer第十章 泛型算法 10.4 再探迭代器 10.5 泛型算法结构

    除了为每个容器定义的迭代器之外,标准库在头文件iterator中还定义了额外几种迭代器.这些迭代器包括以下几种. 插入迭代器(insert iterator):这些迭代器被绑定到一个容器上,可用来向容 ...

  5. C++ primer 第10章 泛型算法

    文章目录 概述 find count 初识泛型算法 只读算法 只读算法accumulate 只读算法equal 写容器元素的算法 算法fill 算法fill_n back_inserter 算法cop ...

  6. C++ Primer 5th笔记(chap 14 重载运算和类型转换)函数调用运算符

    1. 定义 如果类定义了调用运算符(重载了函数调用运算符),则该类的对象被称作函数对象(function object),可以像使用函数一样使用该类的对象, eg. struct absInt{int ...

  7. C++ Primer 5th笔记(chap 14 重载运算和类型转换)可调用对象与function

    1. 5种形式 可调用对象有5种形式,类型各不同: 形式 解释 函数 返回值类型和实参类型 函数指针 返回值类型和实参类型 lambda表达式 类类型 bind创建的对象 todo 重载了函数调用运算 ...

  8. C++ Primer 5th笔记(10)chapter10 泛型算法 :write

    1. fill: 对给定区间全部赋予某值(algorithm.h) 将指定范围内的每个元素都设定为给定的值.如果输入范围有效,则可以安全写入.这个算法只会对输入范围内已存在的元素进行写入操作. tem ...

  9. C++ Primer 5th笔记(10)chapter10 泛型算法 : read

    标准库提供一组不依赖特定的容器类型的共性算法 指定迭代器范围, eg. [begin, end)这种左闭包 3种类型: 只读.写.sort 1. find 查询 template<class I ...

  10. C++ Primer 5th笔记(10)chapter10 泛型算法 :谓词

    1. 定义 谓词(predicate)是一个可调用的表达式,返回结果是一个能用作条件的值. 用于一个对象或一个表达式,如果可以对其使用调用运算符,则称为可调用的: 可调用的对象有:函数.函数指针.重载 ...

最新文章

  1. html固定中心,css 两边固定中间自适应布局的实现
  2. 41. First Missing Positive
  3. 【shell】shuf命令,随机排序
  4. 在SQLite中使用索引优化查询速度
  5. FPGA浮点数定点化
  6. 一切都要从华为云 CloudIDE 酷似 VS Code 说起
  7. 程序员面试金典 - 面试题 17.05. 字母与数字(哈希map+思维转换)
  8. 二十九、制作首页的显示列表
  9. VBA中 各种数据类型的使用(自定义数据类型Type,数组,数据字典)、读写文件
  10. linux uuid挂载磁盘_linux-开机自动挂载磁盘简介
  11. Ubuntu vi命令
  12. dlib疲劳检测_基于OpenCV的实时睡意检测系统
  13. Java | 内部类的实例化
  14. 雨课堂卷子提前看_雨课堂提前看试卷
  15. 对校招生培养工作的建议_贵单位对我校学生培养工作有何建议
  16. php输出所有错误信息
  17. Labview实现简单知乎日报客户端
  18. 小程序源码:求职招聘微信小程序-多玩法安装简单
  19. 漫话最短路径(二)--bellman-Ford(贝尔曼-福特)算法
  20. C++学习(二零三)Quaro Geforce Tesla

热门文章

  1. c3p0 mysql maven_Maven+JSP+Servlet+C3P0+Mysql实现的音乐库管理系统
  2. mysql高性能学习笔记03_MySQL高性能学习笔记
  3. oracle和dba,oracle db、dba和rdba
  4. 布线干货 | 线缆截面积的测量标准
  5. 乱乱乱!那些惨不忍睹的机房布线
  6. 『机房工程』弱电必备技能培训PPT/值得您分享
  7. pat数素数 20 c语言,PAT乙级C语言1013 数素数
  8. 成功解决在excel表中通过数学函数转换后,接着去掉公式转为不再随着变化的数值
  9. Python之Pandas:pandas.read_csv()函数的简介、具体案例、使用方法详细攻略
  10. 成功解决ValueError: If using all scalar values, you must pass an index