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表示式 ...