C++11学习笔记(六)
来源:互联网 发布:大数据就业前景 编辑:程序博客网 时间:2024/05/18 12:34
【lambda函数】
先看一段含有lambda函数的代码
int main() { int girls = 3, boys = 4; auto totalChild = [](int x, int y)->int{ return x + y; }; return totalChild(girls, boys);}
通常情况下,lambda函数的语法定义如下
[capture](parameters) mutable ->return-type{statement}
[capture] 捕捉列表(捕捉上下文变量供lambda函数使用)
(parameters) 参数列表(与普通函数的参数列表一致)
mutable mutable修饰符(默认情况下,lambda函数具有const性,mutable可以取消其常量性)
->return-type 返回类型 用追踪返回类型形式声明函数的返回类型。
{statement} 函数体(内容和普通函数一样)
下面是各式各样的lambda函数形式
int main(){ []{}; // 最简lambda函数 int a = 3; int b = 4; [=] { return a + b;}; // 省略了参数列表与返回类型,返回类型由编译器推断为int auto fun1 = [&](int c) { b = a + c; }; // 省略了返回类型,无返回值 auto fun2 = [=, &b](int c)->int { return b += a + c; }; // 各部分都很完整}
捕捉列表由多个捕捉项组成,并以逗号分隔,其形式如下
[var] 表示值传递方式捕捉变量var
[=] 表示值传递方式捕捉所有父作用域的变量(包括this)
[&var] 表示引用传递方式捕捉变量var
[&] 表示引用传递方式捕捉所有作用域的变量(包括this)
[this] 表示值传递方式捕捉当前的this
通过一些组合,捕捉列表可以表示更复杂的意思,比如
[=,&a,&b] 表示以引用传递方式捕捉变量a和b,值传递方式捕捉其他所有变量
[&,a,this] 表示以值传递方式捕捉变量a和this,引用传递方式捕捉其它所有变量
【lambda与仿函数】
仿函数,简单的说,就是 重定义了成员函数operator()的一种自定义类型对象。
下面看一个仿函数的例子
class _functor {public: int operator()(int x, int y) { return x + y; }};int main(){ int girls = 3, boys = 4; _functor totalChild; return totalChild(5, 6);}
在这个例子中,class _functor的operator() 被重载,因此看到的是和函数调用一样的形式。
来对比一下 仿函数 和 lambda函数
class AirportPrice{private: float _dutyfreerate;public: AirportPrice(float rate): _dutyfreerate(rate){} float operator()(float price) { return price * (1 - _dutyfreerate/100); }};int main(){ float tax_rate = 5.5f; AirportPrice Changi(tax_rate); auto Changi2 = [tax_rate](float price)->float{ return price * (1 - tax_rate/100); }; float purchased = Changi(3699); float purchased2 = Changi2(2899);}
lambda函数捕捉到 tax_rate变量,而仿函数 使用 tax_rate初始化类。事实上,仿函数是编译器实现lambda的一种方式。也可以说,lambda函数是仿函数的“语法甜点”。
使用lambda函数时,捕捉列表不同,会导致不同的结果。
#include <iostream>using namespace std;int main() { int j = 12; auto by_val_lambda = [=] { return j + 1;}; auto by_ref_lambda = [&] { return j + 1;}; cout << "by_val_lambda: " << by_val_lambda() << endl; cout << "by_ref_lambda: " << by_ref_lambda() << endl; j++; cout << "by_val_lambda: " << by_val_lambda() << endl; cout << "by_ref_lambda: " << by_ref_lambda() << endl;}
运行之后结果如下
1 0
- C语言学习笔记<六>
- Objective C学习笔记(六)
- ASP.Net 3.5学习笔记(C#)六
- 《C和指针》学习笔记(六)
- C++学习笔记(Thinking in C++)六
- Object-C学习笔记六-----Xcode快捷键
- 《C++Primer Plus》学习笔记(六)
- c语方学习笔记六
- [C++]C++学习笔记(六)
- 《Effective C++》学习笔记(六)
- C语言程序学习(六)笔记
- Objective-C学习笔记(六)-类
- C语言学习笔记(六)字符串
- C学习笔记(六)字符串遍历
- 《effective c++》学习笔记(六)
- C++11学习笔记(六)
- iOS开发学习笔记-C语言学习(六)
- 《C语言宝典》学习笔记(六):运算符
- web前端工程师基础知识点
- Qt中QTabWidget常用
- java 代理设计模式
- 我的大学——学习生活总结
- 其它好文章
- C++11学习笔记(六)
- 工具条CToolBar与状态条CStatusBar的基本添加方法
- C++11学习笔记(三)
- C++11学习笔记(二)
- iOS 修改类名
- C++11学习笔记(一)
- 关于Linux命令ls的一道笔试题
- 多级指针
- [转载]分页查询