例子
把斐波那契數列的前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:具有靜態存儲時間的變量(全局變量等),此時表現爲引用