C 匿名函式

2021-10-19 04:58:48 字數 2410 閱讀 5891

1.1乙個簡單的示例:

#includeusing namespace std;

int main();

int num = fun(10);// 呼叫

cout << num << endl;// 測試返回值

return 0;

}

1.2基礎示例
#include // std::sort()

#include // std::string

#include // std::cout std::endl

int main(void)

); std::cout << "從大到小排序:" << text << std::endl;

return 0;

}

輸出結果:

從大到小排序:nnbaaa
之前的教程中,我們是直接宣告定義了乙個less()函式來改變std::sort()的排序方式。使用匿名函式的好處就是不需要費時間去思考函式的名字,那麼也因此少了乙個識別符號,就少了衝突的風險。而且如果定義less()函式,那麼檢視**時std::sort(text.begin(), text.end(), less);,有可能還需要去找函式less()定義,而使用匿名函式就可以不需要去其他地方找函式定義了。

1.3基礎拓展 1

如果編譯器推導出的返回型別並不是你期望的,可以使用後置返回型別來指定返回型別:

auto to_double = (float value) -> double

上面**如果不指定返回型別double,那麼它的返回型別就是float

1.4基礎拓展 2

std::sort(text.begin(), text.end(), (char x, char y)

);

對於匿名函式的形式引數,如果你覺得它太長,可以改寫成以下形式:

std::sort(text.begin(), text.end(), (auto x, auto y)

);

編譯器可以根據實際情況,推導出引數x和引數y的資料型別

2.1基礎示例

匿名函式裡面是用來捕獲的。下面是如何使用捕獲的簡單例子:

#include // std::cout std::endl

#include // std::string std::to_string

int main(void)

; // 匿名函式的大括號後面需要加分號。

// 呼叫函式

add_to_back();

// 輸出

std::cout << text << std::endl;

return 0;

}

2.2基礎講解

上面**中,使用變數add_to_back儲存匿名函式。

匿名函式捕獲的多個變數可以用,隔開寫在裡面。

如果在裡面直接寫外部變數名稱如laugh,那麼匿名函式所做的操作是複製,也就是說,變數記憶體很大的話,複製資料很多,速度慢;而且這個laugh在匿名函式裡面是不能被賦值的。

如果在裡面寫外部變數名稱並且在前面加&&text,那麼它不會複製資料,而是傳遞的資料的引用。所以資料大的話就應該用這個;而且再匿名函式中對text進行修改,外部的變數text也會隨之改變。所以**中輸出字串text是改變後的字串。

如果需要為捕獲的變數起個別名,上面**中匿名函式可以這樣寫:

auto add_to_back = [&t = text, l = laugh](void)

;

2.3基礎拓展

是不捕獲,[=]就是lambda所用到的外部變數都會直接複製捕獲,[&]就是lambda所用到的外部變數都會直接引用捕獲,[this]以引用捕獲當前物件(用於類內部)。

匿名函式作為預設實參

當匿名函式作為預設實參時,匿名函式是不能捕獲任何內容的,否則編譯將會報錯。

C 匿名函式

所謂匿名函式,其實類似於python中的lambda函式,其實就是沒有名字的函式。使用匿名函式,可以免去函式的宣告和定義。這樣匿名函式僅在呼叫函式的時候才會建立函式物件,而呼叫結束後立即釋放,所以匿名函式比非匿名函式更節省空間 c 中的匿名函式通常為 capture parameters retur...

C 匿名函式

匿名函式是乙個 內聯 語句或表示式,可在需要委託型別的任何地方使用。可以使用匿名函式來初始化命名委託,或傳遞命名委託 而不是命名委託型別 作為方法引數。c 中委託的發展 在 c 1.0 中,您通過使用在 中其他位置定義的方法顯式初始化委託來建立委託的例項。c 2.0 引入了匿名方法的概念,作為一種編...

C 匿名函式

c 中委託的演變 c 1 中,通過使用在 中其他位置定義的方法顯式初始化委託來建立委託的例項 c 2中,引入了匿名方法的概念,作為一種編寫可在委託呼叫中執行的未命名內聯句塊的方式 c 3 中,引入了lambda 表示式,這種表示式和匿名方法類似,但更具表達力 更簡單。匿名方法 和lambda表示式 ...