C++ Primer 5th笔记(chap 14 重载运算和类型转换)lambda函数对象
1. 定义
lambda是函数对象:编写一个lambda后,编译器会将该表达式转换成一个未命名类的未命名对象,类中含有一个重载的函数调用运算符。
eg.
stable_sort(words.begin(),words.end(),[](const string &a,const string &b)
{return a.size() < b.size();});//等价于下面的类:
class ShorterString{public:bool operator()(const string &a,const string &b){return a.size() < b.size();}
};
stable_sort(words.begin(),words.end(),ShorterString());
测试代码:
std::vector<string> words = { "a31", "b1" };
stable_sort(words.begin(), words.end(), [](const string& a, const string& b){return a.size() < b.size(); });
for_each(words.begin(), words.end(), [](const string& s){std::cout << s << endl; });std::vector<string> words2 = { "a31", "b1" };
stable_sort(words2.begin(), words2.end(), ShorterString());
for_each(words2.begin(), words2.end(), [](const string& s){std::cout << s << endl; });
输出结果为
b1
a31
b1
a31
2. 表示 lambda 及相应捕获行为的类
lambda产生的类必须为每个值捕获的变量建立对应的数据成员,同时创建构造函数。
eg.
auto wc = find_if(words.begin(),words.end(),[sz](const string &a){return a.size() > = sz;})//该 lambda 表达式产生的类将形如:
class SizeComp
{SizeComp(size_t n):sz(n) { }bool operator()(const string &s)const {return s.size() >= sz;}
private:size_t sz;
};
测试代码:
void lambda_functionObject_test2(vector<string>::size_type sz) { std::vector<string> words = { "a31", "b1" };auto wc = find_if(words.begin(), words.end(), [sz](const string& a){return a.size() >= sz; });std::cout << *wc << endl;auto wc2 = find_if(words.begin(), words.end(), SizeComp(sz));std::cout << *wc2 << endl;
}
lambda_functionObject_test2(3);
输出结果:
a31
a31
3. 特性
- lambda默认不能改变它捕获的变量。在默认情况下,由lambda产生的类中的函数调用运算符是一个const成员函数。如果lambda被声明为可变的,则调用运算符就不再是const函数了。
- 通过引用捕获变量时,由程序负责确保lambda执行时该引用所绑定的对象确实存在。因此编译器可以直接使用该引用而无须在lambda产生的类中将其存储为数据成员。
- .通过值捕获的变量被拷贝到lambda中,此时lambda产生的类必须为每个值捕获的变量建立对应的数据成员,并创建构造函数,用捕获变量的值来初始化数据成员。
- .lambda产生的类不包含默认构造函数、赋值运算符和默认析构函数,它是否包含默认拷贝/移动构造函数则通常要视捕获的变量类型而定。
【引用】
[1] 代码functionObject.h
C++ Primer 5th笔记(chap 14 重载运算和类型转换)lambda函数对象相关推荐
- C++ Primer 5th笔记(chap 14 重载运算和类型转换)函数匹配与重载运算符
如果一个类既提供了转换目标是算术类型的类型转换,也提供了重载的运算符,则将会遇到重载运算符与内置运算符的二义性问题. 如果a是一种类型,表达式 a sym b 可能是: //不能通过调用形式来区分当前 ...
- C++ Primer 5th笔记(chap 14 重载运算和类型转换)可调用对象与function
1. 5种形式 可调用对象有5种形式,类型各不同: 形式 解释 函数 返回值类型和实参类型 函数指针 返回值类型和实参类型 lambda表达式 类类型 bind创建的对象 todo 重载了函数调用运算 ...
- C++ Primer 5th笔记(chap 14 重载运算和类型转换)函数调用运算符
1. 定义 如果类定义了调用运算符(重载了函数调用运算符),则该类的对象被称作函数对象(function object),可以像使用函数一样使用该类的对象, eg. struct absInt{int ...
- C++ Primer 5th笔记(chap 14 重载运算和类型转换)递增和递减运算符
并不要求递增和递减运算符一定是类的成员函数,但是因为这个运算符改变的正好是所操作的对象的状态,所以建议将它们设为成员函数. 为了和内置版本保持一致,前置运算符应该返回递增或递减后对象的引用. 为了和内 ...
- C++ Primer 5th笔记(chap 14 重载运算和类型转换)重载运算概述
1. 定义 重载运算是具有特殊名字的函数,它们的名字由关键字operator和其后要定义的运算符号组成. 2. 运算符表 2.1 可重载运算符 运算符类型 运算符种类 双目算术运算符 + (加),-( ...
- C++ Primer 5th笔记(chap 14 重载运算和类型转换)二义性类型转换
1. 在两种情况下会产生二义性转换歧义: 1.1 A类定义了一个接受B类对象的转换构造函数,同时B类定义了一个转换目标是A类的类型转换运算符. struct B; struct A {A() = de ...
- C++ Primer 5th笔记(chap 14 重载运算和类型转换)成员运算符
成员运算符分为两种: 解引用运算符* 箭头运算符-> 设计准则 箭头运算符必须是类的成员. 解引用运算符通常也是类的成员,尽管并非必须如此. 重载的箭头运算符必须返回类的指针或者自定义了箭头运算 ...
- C++ Primer 5th笔记(chap 14 重载运算和类型转换)算术和关系运算符
运算符 双目算术运算符 + (加),-(减),*(乘),/(除),% (取模) 关系运算符 ==(等于),!= (不等于),< (小于),> (大于>,<=(小于等于),> ...
- C++ Primer 5th笔记(chap 14 重载运算和类型转换)类类型转换
1. 定义 类型转换运算符:(既然一个类类型可以由实参类型对象隐式转换而来,那么)一个类类型的值也可以转换成其它类型 形式 : operator type() const type 表示某种类型,类型 ...
最新文章
- Instagram赢家通吃照片社交市场 对手一个个只有关门大吉
- c#事务的使用、示例及注意事项(转)
- 如何在使用ASPMVC4的分部视图中获取数据展示
- Mysql的高可用方案及主从详细配置
- 程序路径查找 找到指定程序所在的目录
- MNIST竞赛准确度99+%技术详解,文末有福利~
- 虚拟机上的linux作为服务器吗,linux ftp服务器 虚拟机做服务器如何实现
- ELK日志分析系统部署
- Android Intent常用方法详细介绍,显示Intent,隐式Intent,调用浏览器,拨号,发短信,传递数据
- WordPress 5.2 Beta 1 发布,将于4月30日推出正式版
- JAVA中String类型的字符替换问题
- JAVA数据类型转换大全
- 入门HTML之表格属性bgcolor background bordercolor(light dark)
- [Tracker] linux 搭建 BitTorrent
- 批量修改文件名.bat
- springboot集成ES实现磁盘文件全文检索
- Java 学习笔记 —— 基础部分
- 百度网盘限速的解决办法
- Mac鼠标滚轮控制浏览器
- Linux在当前文件夹下打开终端
热门文章
- C语言 从指定文件中依次读出字符直至文件结束
- 数据结构-二叉树、完全二叉树、森林等(基础讲解)
- oracle12c bug,Oracle12c R2注意事项: 因BUG生成大量的trace file 包含KRB: (rman module)
- php 如何启动ica文件,IE11打开ICA文件时无法直接调用Citrix Receiver?
- Oracle数据库asm原理,Oracle数据库中ASM功能解剖
- 用python计算贷款_Python基于Logistic回归建模计算某银行在降低贷款拖欠率的数据示例...
- jsp九大内置对象和四大作用域_JSP学习3
- 编程笔试(解析及代码实现):国内各大银行(招商银行/浦发银行等)在线笔试常见题目(猴子吃桃/字符串逆序输出/一段话输出字的个数/单词大小转换等)及其代码实现(Java/Python/C#等)之详细攻略
- Tool之ping:如何使用ping命令检测电脑网络故障图文教程
- 成功解决ModuleNotFoundError: No module named 'torch.utils.tensorboard'