C++ Primer 5th笔记(chap 14 重载运算和类型转换)lambda函数对象
生活随笔
收集整理的這篇文章主要介紹了
C++ Primer 5th笔记(chap 14 重载运算和类型转换)lambda函数对象
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
1. 定義
lambda是函數對象:編寫一個lambda后,編譯器會將該表達式轉換成一個未命名類的未命名對象,類中含有一個重載的函數調用運算符。
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; });輸出結果為
b1 a31 b1 a312. 表示 lambda 及相應捕獲行為的類
lambda產生的類必須為每個值捕獲的變量建立對應的數據成員,同時創建構造函數。
eg.
auto wc = find_if(words.begin(),words.end(),[sz](const string &a){return a.size() > = sz;})//該 lambda 表達式產生的類將形如: 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);輸出結果:
a31 a313. 特性
- lambda默認不能改變它捕獲的變量。在默認情況下,由lambda產生的類中的函數調用運算符是一個const成員函數。如果lambda被聲明為可變的,則調用運算符就不再是const函數了。
- 通過引用捕獲變量時,由程序負責確保lambda執行時該引用所綁定的對象確實存在。因此編譯器可以直接使用該引用而無須在lambda產生的類中將其存儲為數據成員。
- .通過值捕獲的變量被拷貝到lambda中,此時lambda產生的類必須為每個值捕獲的變量建立對應的數據成員,并創建構造函數,用捕獲變量的值來初始化數據成員。
- .lambda產生的類不包含默認構造函數、賦值運算符和默認析構函數,它是否包含默認拷貝/移動構造函數則通常要視捕獲的變量類型而定。
【引用】
[1] 代碼functionObject.h
總結
以上是生活随笔為你收集整理的C++ Primer 5th笔记(chap 14 重载运算和类型转换)lambda函数对象的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C++ Primer 5th笔记(cha
- 下一篇: s3c2440移植MQTT