C 11 lambda表示式基礎使用

2021-10-07 14:33:25 字數 1589 閱讀 3673

lambda表示式 是乙個函式,乙個匿名函式,也就是沒有函式名的函式,為什麼不需要函式名呢,因為我們直接(一次性的)用它,嵌入式用的它,不需要其他地方用它。

也叫閉包,閉就是封閉的意思,就是其他地方都不用他,包就是函式。

lambda表示式 其實就是乙個函式物件,他內部建立了乙個過載()操作符的類。

int main() ();  //代表lambda表示式的開始,{}代表函式體,什麼都沒有,()代表呼叫函式.

}等價於:

void f() {}

int main() 

像其他函式一樣,我們需要乙個引數列表:()。

所以: {}(); 也可以寫: () {}();

注:加了乙個()代表函式引數。什麼引數都沒有,就可以省略。

int main()

();}

也可以這樣:

int main()

;lam();}

-> int :代表返回int。

{}(); 加引數也可以這樣寫: () {}(); 加引數、返回值這樣寫  ()-> int {}; 

int main()

;auto ret = lam();

auto lam2 =() -> string ;

auto ret1 = lam2();}

變數捕獲才是成就lambda卓越的秘方。

不捕獲任何變數

[&] 以引用方式捕獲所有變數

[=] 用值的方式捕獲所有變數(可能被編譯器優化為const &)

[=, &foo] 以引用捕獲foo, 但其餘變數都靠值捕獲

[&, foo] 以值捕獲foo, 但其餘變數都靠引用捕獲

[bar] 以值方式捕獲bar; 不捕獲其它變數

[this] 捕獲所在類的this指標

int a=1,b=2,c=3;

auto lam2 = [&,a]();   //b,c以引用捕獲,a以值捕獲。

lam2();

思考: lambda變數捕獲與lambda函式引數使用的區別及各自的優缺點

vectoraddress;

for_each(address.begin(),address.end(),(string& str)

}return results;

}void setaddress(const std::vector&address)

private:

std::vector_addresses;

};addressbook global_address_book;

//查詢匹配名字的位址

vectorfindaddressesfromname (const string &name));}

//查詢匹配長度的位址

vectorfindaddresseslen (const int &min_len)

);}int main()

;global_address_book.setaddress(address);

auto ret = findaddressesfromname("china");

for_each(ret.begin(),ret.end(),(string &i)

C 11 lambda表示式 詳解

如下圖,lambda表示式由下面幾個部分構成 c 11 的 lambda 表示式規範如下 mutable 修飾符說明 lambda 表示式體內的 可以修改 獲的變數,並且可以訪問 獲物件的 non const 方法。exception 說明 lambda 表示式是否丟擲異常 noexcept 以及丟...

C 11 lambda 表示式解析

中括號中 from 下面是各種變數擷取的選項 小括號中,就是函式引數 lambda表示式可以作為其它函式引數 1 標準格式 有箭頭 就要顯示寫明返回值型別 auto pfunc1 this void pfunc1 2 簡化格式 void 型別返回值 沒有箭頭 會預設檢測返回值型別 auto pfun...

C 11 Lambda表示式簡介

lambda簡介 capture列表 mutable說明 c 11中的lambda 表示式用於定義並建立匿名的函式物件,以簡化程式設計工作。lambda表示式一般都是從方括號開始,然後結束於花括號 主要包括五個部分 常見幾種lambda表示式形式 表示式 capture params mutable...