c Lambda 函式形式及用法

2021-08-02 18:36:02 字數 1689 閱讀 5558

宣告:本文參考了 和

lambda函式又稱lambda函式和匿名函式,是c++11新加入的乙個十分強大的特性。在程式設計中經常可以用到。

我們可以這樣定義乙個lambda函式:

#include

int main();//省略函式型別

auto f2 = () -> int ;//函式型別後置

}

其中f1即可呼叫或者作為引數被傳入(類似於函式指標的作用)。auto可以自動獲得f1的型別,依據f1函式體中返回值的型別來判斷,若無返回,則為void。也可以顯式指定返回型別如f2,需用函式型別後置。

也可以這樣子在傳參時進行定義:

#include

void func(std::function)

int main() );

}

總的來說,lambda表示式的形式為:

[captures] (params) -> ret

用於擷取外部資訊,可以使函式使用外部作用域的變數。先假設外部有x,y兩個變數,則可有下列選項:

() 是傳參列表,與普通函式的引數列表極其相似。

->ret 即函式型別可以省略,也僅有此項可以省略。

{} 為函式體

就比如:

storage;

這時候想在public中設計乙個通過name或者時間來查詢會議的方法時,就必須提供乙個介面來讓使用者自定義查詢方法。實現如下:

storage

};要使用時:

storage.query([&name] (const meeting &t) );//通過名字查詢

storage.query([&date] (const meeting &t) );//通過時間查詢

另外,在我們程式中,經常有這樣一些需求:

1. 需要乙個臨時方法,這個方法只會使用一次,或者使用的很少。

2. 這個方法的方法體很短,以至於比方法宣告都短,寫起來感覺大材小用。

這個時候lambda就可以大顯身手了。簡單來說,程式設計中提到的 lambda 表示式,通常是在需要乙個函式,但是又不想費神去命名乙個函式的場合下使用(此處尤其指上文提到的第二種定義方法)。不用多定義乙個(汙染環境的)函式,尤其如果這個函式只會使用一次的話。而且更易讀,因為那個對映到列表上的函式具體是要做什麼,非常一目了然。例子如下:

當你想改變乙個vector的時候,原來你得這麼寫:

vectorv;

v.push_back( 1 );

v.push_back( 2 );

//...

for ( auto itr = v.begin(), end = v.end(); itr != end; itr++ )

用lambda則為:

vectorv;

v.push_back( 1 );

v.push_back( 2 );

//...

for_each( v.begin(), v.end(), (int &val) );

這麼寫了之後更清晰,方便,而且執行效率反而提高了。因為編譯器有可能使用」迴圈展開「來加速執行過程。

C lambda函式總結

c11新增加的特性,不過現在都c20了不新了。捕捉列表 引數 屬性 返回值型別引出符 因為lambda無法直接使用區域性變數,所以需要對變數進行捕捉,也就是需要通過捕捉列表通知c 這些變數我要拿來用。包含幾種不同的形式 形式 作用 x 表示以值傳遞的方式獲得變數x 表示以值傳遞的方式獲取所有父作用域...

C Lambda表示式用法

c 11中的lambda表示式用於定義並建立匿名的函式物件,以簡化程式設計工作。lambda的語法形式如下 函式物件引數 操作符過載函式引數 mutable或exception宣告 返回值型別可以看到,lambda主要分為五個部分 函式物件引數 操作符過載函式引數 mutable或exception...

C Lambda表示式用法

c 11中的lambda表示式用於定義並建立匿名的函式物件,以簡化程式設計工作。lambda的語法形式如下 函式物件引數 操作符過載函式引數 mutable或exception宣告 返回值型別 可以看到,lambda主要分為五個部分 函式物件引數 操作符過載函式引數 mutable或exceptio...