C++ Primer 5th笔记(10)chapter10 泛型算法 :lambda
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相关推荐
- C++ Primer 学习笔记 第十章 泛型算法
C++ Primer 学习笔记 第十章 泛型算法 336 find函数 #include <iostream> #include <vector> #include <s ...
- C++ Primer 5th笔记(10)chapter10 泛型算法 :泛型算法结构
名称 定义 输入迭代器 只读,不写:单遍扫描,只能递增 输出迭代器 只写,不读:单遍扫描,只能递增 前向迭代器 可读写,多遍扫描,只能递增 双向迭代器 可读写,多遍扫描,可递增递减 随机访问迭代器 可 ...
- C++ Primer 5th笔记(10)chapter10 泛型算法 :迭代器
迭代器类别 名称 定义 插入迭代器 这些迭代器被绑定到一个容器上,可用来向容器插入元素 流迭代器 这些迭代器被绑定到输入或输出流上,可用来遍历所有关联的IO流 反向迭代器 这些迭代器向后而不是向前移动 ...
- C++primer第十章 泛型算法 10.4 再探迭代器 10.5 泛型算法结构
除了为每个容器定义的迭代器之外,标准库在头文件iterator中还定义了额外几种迭代器.这些迭代器包括以下几种. 插入迭代器(insert iterator):这些迭代器被绑定到一个容器上,可用来向容 ...
- C++ primer 第10章 泛型算法
文章目录 概述 find count 初识泛型算法 只读算法 只读算法accumulate 只读算法equal 写容器元素的算法 算法fill 算法fill_n back_inserter 算法cop ...
- C++ Primer 5th笔记(chap 14 重载运算和类型转换)函数调用运算符
1. 定义 如果类定义了调用运算符(重载了函数调用运算符),则该类的对象被称作函数对象(function object),可以像使用函数一样使用该类的对象, eg. struct absInt{int ...
- C++ Primer 5th笔记(chap 14 重载运算和类型转换)可调用对象与function
1. 5种形式 可调用对象有5种形式,类型各不同: 形式 解释 函数 返回值类型和实参类型 函数指针 返回值类型和实参类型 lambda表达式 类类型 bind创建的对象 todo 重载了函数调用运算 ...
- C++ Primer 5th笔记(10)chapter10 泛型算法 :write
1. fill: 对给定区间全部赋予某值(algorithm.h) 将指定范围内的每个元素都设定为给定的值.如果输入范围有效,则可以安全写入.这个算法只会对输入范围内已存在的元素进行写入操作. tem ...
- C++ Primer 5th笔记(10)chapter10 泛型算法 : read
标准库提供一组不依赖特定的容器类型的共性算法 指定迭代器范围, eg. [begin, end)这种左闭包 3种类型: 只读.写.sort 1. find 查询 template<class I ...
- C++ Primer 5th笔记(10)chapter10 泛型算法 :谓词
1. 定义 谓词(predicate)是一个可调用的表达式,返回结果是一个能用作条件的值. 用于一个对象或一个表达式,如果可以对其使用调用运算符,则称为可调用的: 可调用的对象有:函数.函数指针.重载 ...
最新文章
- html固定中心,css 两边固定中间自适应布局的实现
- 41. First Missing Positive
- 【shell】shuf命令,随机排序
- 在SQLite中使用索引优化查询速度
- FPGA浮点数定点化
- 一切都要从华为云 CloudIDE 酷似 VS Code 说起
- 程序员面试金典 - 面试题 17.05. 字母与数字(哈希map+思维转换)
- 二十九、制作首页的显示列表
- VBA中 各种数据类型的使用(自定义数据类型Type,数组,数据字典)、读写文件
- linux uuid挂载磁盘_linux-开机自动挂载磁盘简介
- Ubuntu vi命令
- dlib疲劳检测_基于OpenCV的实时睡意检测系统
- Java | 内部类的实例化
- 雨课堂卷子提前看_雨课堂提前看试卷
- 对校招生培养工作的建议_贵单位对我校学生培养工作有何建议
- php输出所有错误信息
- Labview实现简单知乎日报客户端
- 小程序源码:求职招聘微信小程序-多玩法安装简单
- 漫话最短路径(二)--bellman-Ford(贝尔曼-福特)算法
- C++学习(二零三)Quaro Geforce Tesla
热门文章
- c3p0 mysql maven_Maven+JSP+Servlet+C3P0+Mysql实现的音乐库管理系统
- mysql高性能学习笔记03_MySQL高性能学习笔记
- oracle和dba,oracle db、dba和rdba
- 布线干货 | 线缆截面积的测量标准
- 乱乱乱!那些惨不忍睹的机房布线
- 『机房工程』弱电必备技能培训PPT/值得您分享
- pat数素数 20 c语言,PAT乙级C语言1013 数素数
- 成功解决在excel表中通过数学函数转换后,接着去掉公式转为不再随着变化的数值
- Python之Pandas:pandas.read_csv()函数的简介、具体案例、使用方法详细攻略
- 成功解决ValueError: If using all scalar values, you must pass an index