C++ Primer 5th笔记(chap 14 重载运算和类型转换)lambda函数对象
生活随笔
收集整理的這篇文章主要介紹了
C++ Primer 5th笔记(chap 14 重载运算和类型转换)lambda函数对象
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
1. 定義
lambda是函數(shù)對象:編寫一個lambda后,編譯器會將該表達式轉(zhuǎn)換成一個未命名類的未命名對象,類中含有一個重載的函數(shù)調(diào)用運算符。
eg.
stable_sort(words.begin(),words.end(),[](const string &a,const string &b) {return a.size() < b.size();});//等價于下面的類: class ShorterString{ public:bool operator()(const string &a,const string &b){return a.size() < b.size();} }; stable_sort(words.begin(),words.end(),ShorterString());測試代碼:
std::vector<string> words = { "a31", "b1" }; stable_sort(words.begin(), words.end(), [](const string& a, const string& b){return a.size() < b.size(); }); for_each(words.begin(), words.end(), [](const string& s){std::cout << s << endl; });std::vector<string> words2 = { "a31", "b1" }; stable_sort(words2.begin(), words2.end(), ShorterString()); for_each(words2.begin(), words2.end(), [](const string& s){std::cout << s << endl; });輸出結(jié)果為
b1 a31 b1 a312. 表示 lambda 及相應(yīng)捕獲行為的類
lambda產(chǎn)生的類必須為每個值捕獲的變量建立對應(yīng)的數(shù)據(jù)成員,同時創(chuàng)建構(gòu)造函數(shù)。
eg.
auto wc = find_if(words.begin(),words.end(),[sz](const string &a){return a.size() > = sz;})//該 lambda 表達式產(chǎn)生的類將形如: class SizeComp {SizeComp(size_t n):sz(n) { }bool operator()(const string &s)const {return s.size() >= sz;} private:size_t sz; };測試代碼:
void lambda_functionObject_test2(vector<string>::size_type sz) { std::vector<string> words = { "a31", "b1" };auto wc = find_if(words.begin(), words.end(), [sz](const string& a){return a.size() >= sz; });std::cout << *wc << endl;auto wc2 = find_if(words.begin(), words.end(), SizeComp(sz));std::cout << *wc2 << endl; } lambda_functionObject_test2(3);輸出結(jié)果:
a31 a313. 特性
- lambda默認不能改變它捕獲的變量。在默認情況下,由lambda產(chǎn)生的類中的函數(shù)調(diào)用運算符是一個const成員函數(shù)。如果lambda被聲明為可變的,則調(diào)用運算符就不再是const函數(shù)了。
- 通過引用捕獲變量時,由程序負責(zé)確保lambda執(zhí)行時該引用所綁定的對象確實存在。因此編譯器可以直接使用該引用而無須在lambda產(chǎn)生的類中將其存儲為數(shù)據(jù)成員。
- .通過值捕獲的變量被拷貝到lambda中,此時lambda產(chǎn)生的類必須為每個值捕獲的變量建立對應(yīng)的數(shù)據(jù)成員,并創(chuàng)建構(gòu)造函數(shù),用捕獲變量的值來初始化數(shù)據(jù)成員。
- .lambda產(chǎn)生的類不包含默認構(gòu)造函數(shù)、賦值運算符和默認析構(gòu)函數(shù),它是否包含默認拷貝/移動構(gòu)造函數(shù)則通常要視捕獲的變量類型而定。
【引用】
[1] 代碼functionObject.h
總結(jié)
以上是生活随笔為你收集整理的C++ Primer 5th笔记(chap 14 重载运算和类型转换)lambda函数对象的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C++ Primer 5th笔记(cha
- 下一篇: C++ Primer 5th笔记(cha