日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

C++ Primer 5th笔记(chap 14 重载运算和类型转换)lambda函数对象

發布時間:2025/3/21 c/c++ 15 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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 a31

2. 表示 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 a31

3. 特性

  • lambda默認不能改變它捕獲的變量。在默認情況下,由lambda產生的類中的函數調用運算符是一個const成員函數。如果lambda被聲明為可變的,則調用運算符就不再是const函數了。
  • 通過引用捕獲變量時,由程序負責確保lambda執行時該引用所綁定的對象確實存在。因此編譯器可以直接使用該引用而無須在lambda產生的類中將其存儲為數據成員。
  • .通過值捕獲的變量被拷貝到lambda中,此時lambda產生的類必須為每個值捕獲的變量建立對應的數據成員,并創建構造函數,用捕獲變量的值來初始化數據成員。
  • .lambda產生的類不包含默認構造函數、賦值運算符和默認析構函數,它是否包含默認拷貝/移動構造函數則通常要視捕獲的變量類型而定。

【引用】

[1] 代碼functionObject.h

總結

以上是生活随笔為你收集整理的C++ Primer 5th笔记(chap 14 重载运算和类型转换)lambda函数对象的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。