宣告:本文參考了 和
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...