2018 7 11學習內容 lambda函式詳解

2021-08-21 08:51:24 字數 2292 閱讀 4387

lambda 函式與表示式

lambda函式的語法定義如下:

[

capture

](parameters

)mutable

->

return_type

其中:

在 lambda 函式的定義式中,引數列表和返回型別都是可選部分,而捕捉列表和函式體都可能為空,c++ 中最簡單的 lambda 函式只需要宣告為:

{};

例1:

定義乙個可以輸出字串的lambda表示式,表示式一般都是從方括號開始,然後結束於花括號{},花括號裡面就像定義函式那樣,包含了lamdba表示式體:

// 定義簡單的lambda表示式

auto

basiclambda =

;// 呼叫

basiclambda

();// 輸出:hello, world!

如果需要引數,那麼就要像函式那樣,放在圓括號裡面,如果有返回值,返回型別要放在->後面,即拖尾返回型別,當然你也可以忽略返回型別,lambda會幫你自動推斷出返回型別:

// 指明返回型別

auto

add =(

inta

,intb)

->

int;

// 自動推斷返回型別

auto

multiply =(

inta

,intb)

;int

sum

=add(2

,5);// 輸出:7

intproduct

=multiply(2

,5);// 輸出:10

例如:lambda函式很簡潔,但變化較多。

1、什麼也不捕獲,或者是故意不用 lambda 函式外部的變數

#include

using

namespace

std;

intmain();

func

();}

// 結果報錯,因為未指定預設捕獲模式

正確的如下:

#include

using

namespace

std;

intmain();

func

();}

2、引用捕獲

#include

using

namespace

std;

intmain();

fun1

();}

3、複製並引用捕獲

#include

using

namespace

std;

intmain();

fun1

();}

4、指定引用或複製

#include

using

namespace

std;

intmain();

fun1

();}

5、捕獲this指標

#include

using

namespace

std;

class

test

;void

lambda();

fun();}};

intmain

()

:預設不捕獲任何變數;

[=]:預設以值捕獲所有變數;

[&]:預設以引用捕獲所有變數;

[x]:僅以值捕獲x,其它變數不捕獲;

[&x]:僅以引用捕獲x,其它變數不捕獲;

[=, &x]:預設以值捕獲所有變數,但是x是例外,通過引用捕獲;

[&, x]:預設以引用捕獲所有變數,但是x是例外,通過值捕獲;

[this]:通過引用捕獲當前物件(其實是複製指標);

[*this]:通過傳值方式捕獲當前物件;

lambda表示式無法修改通過複製形式捕捉的變數,因為函式呼叫運算子的過載方法是const屬性的。有時候,你想改動傳值方式捕獲的值,那麼就要使用mutable,例子如下:

int

main();

// 複製捕捉x

cout

<<

add_x(10

)<<

endl

;// 輸出 30

return0;

}

hive 學習內容

1 hive的正則匹配搜尋表 show tables like sub name show tables like s 以s開頭的所有的 2檢視表結構 desc table name desc formatted table name 3檢視分割槽資訊 show partition table na...

學習內容分享

一 求 兩個數 30.30 和 40 的最大值?public class ex0031 system.out.println 最大值是 max 二 判斷公元1988年是否為閏年?可被4整除 但不可被100整除 為閏年,但是正百的年數必須是可以被400整除的才是閏年 public class ex00...

2016 12 06學習內容

節點查詢 父節點 parentnode 兄弟節點 下乙個兄弟 nextsibling ie6 78 識別 nextelementsibling 其他瀏覽器識別 相容處理 one.nextelementsibling one.nextsibling preivoussibling previousel...