例子
把斐波那契数列的前9个数存入vector容器。并输出。
#include <iostream> #include <algorithm> #include <vector> using namespace std; int main() { const int elementNum=9; vector<int> vecInt(elementNum,1); int x=1,y=1; generate_n(vecInt.begin()+2,elementNum-2,[=] ()mutable throw() ->int{ int n=x+y; x=y; y=n; return n; }); for_each(vecInt.begin(),vecInt.end(),[](int n){cout<<n<<" ";}); cout<<endl; cout<<x<<" "<<y<<endl; }
例子分析
图中各标识的意义:
1:[]声明了一个lambda表达式,=为捕获语法
2:参数列表
3:可变规范
4:异常规范
5:返回值
6:Lambda表达式主体
捕获子句
[] 声明了Lambda表达式,表示一个Lambda表达式开始了。=和&是两种捕获符号。
[=,&x]
[&x,y]
[&,y]
是一样的。即[]中如果第一个参数为‘=’,则除非特殊指定的变量,都采用拷贝方式。如果第一个参数为‘&’,则除非特殊指定的变量,都采用引用方式。
如果[]中没有参数,则Lambda不能访问外部变量。
参数列表
与函数列表类似,但是:
不能有默认参数,不能有变长参数,不能有未命名参数。
参数列表是可选的,如果不写参数列表,即不写‘()’,那么必须也不能写可变规范,异常规范和返回值。
可变规范
以‘=’捕获的都是拷贝的副本,是只读的,如果想修改捕获的变量的副本,则必须加上mutable,但是对副本的修改不会影响原来的变量。
异常规范
不多说了。
返回值
返回值语法->Type。例如->int,->double。
如果Lambda主体只包含一条语句,即return语句,或者没有返回值,那么可以不用写返回值语句。
Lambda表达式主体
Lambda可以访问的变量:
1:从封闭范围内捕获的变量
2:参数
3:本地变量(表达式主体中定义的变量)
4:类的成员变量(Lambda定义在类中),表现为引用
5:具有静态存储时间的变量(全局变量等),此时表现为引用