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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 人文社科 > 生活经验 >内容正文

生活经验

【C++】lambda 表达式

發布時間:2023/11/27 生活经验 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【C++】lambda 表达式 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

1.lambda 表達式

1.1 lambda 特點

  • lambda表示一個可調用單元,可視為內聯函數

  • 范式 : 具有一個返回類型,一個參數列表,一個函數體

[captrue list](parameters list)->return type {function body}
captrue list 捕獲列表是一個lambda所在函數中定義局部變量的列表(通常為空),但與普通函數不同,lambda必須有尾置返回類指定返回類型。
  • 可以忽略參數列表和返回類型

  • auto f = [] {return 42; };
    std::cout << f() << std::endl;
    
  • 實參必須與形參匹配(lambda沒有默認參數,數量相等,一旦初始化完畢,就可以執行函數體

    bool isShorter(const string& s1, const string& s2) {return s1.size() < s2.size();
    }
    

    使用lambda實現如下

    [](const string& s1, const string& s2) 
    {return s1.size() < s2.size();}
    

    注:空捕獲表明該lambda沒有使用任何局部變量

1.2 基于lambda不同捕獲方式(實現的stable-sort)

bool isShorter(const string& s1, const string& s2) {return s1.size() < s2.size();
}int main(char argc, int* argv[]) {vector<string> wordVec = { "the","quick","red","fox","jnmp","slow","over","the","red" };std::stable_sort(wordVec.begin(), wordVec.end(), isShorter);//the red fox the red jnmp slow over quickstable_sort(wordVec.begin(), wordVec.end(),[](const string& a, const string& b){return a.size() < b.size(); });
}
  • lambda必須使用明確指明的變量,使用的局部變量必須通過捕獲列表指出lambda在其內部包含訪問的局部比那輛所需要的的信息。

    例如:

    • 1 sz值正常捕獲

      [sz](const string &a){return a.size() >= sz};
      
    • 2 錯誤 sz值未捕獲

      [](const string &a){return a.size() >= sz};
      
    • 當向一個函數傳遞lambda時候,同時定義一個新的類型和該類型的對象。

    • lambda生成的類都包含一個對應該lambda所捕獲的變量的成員,該成員在對象創建時倍初始化。

      • 值傳遞
      void func1(){size_t v1=42;auto f=[v]{return v1;};v1=0;auto j=f();//j為42,f保存v1的拷貝
      }
      
      • 引用捕獲

        void func2(){size_t v1=42;auto f2=[&v]{return v1;};  //差異  &多了一個引用符號v1=0;auto j=f2();//j為42,f保存v1的拷貝
        }
        

2. lambda表達式的值捕獲和引用捕獲

2.1 for_each獲取指定的長度排序后的字符串長度,lambda表達式

string make_plural(size_t ctr, const string& word, const string& ending)
{return (ctr == 1) ? word : word + ending;//make_plural(wc, "word ", "s ")當輸入中文本中//word數大于一是在word后加s,為words為word的復數!
}int main(char argc, int* argv[]) {vector<string> wordVec = { "the","quick","red","fox","jnmp","slow","over","the","red" };//the red fox the red jnmp slow over quickstable_sort(wordVec.begin(), wordVec.end(),[](const string& a, const string& b){return a.size() < b.size(); });vector<string>::size_type sz  = 4;auto wc = find_if(wordVec.begin(), wordVec.end(),[sz](const string& a){return a.size() >= sz; });auto count = wordVec.end() - wc;cout << count << " " << make_plural(count, "word", "s") << " of length" << sz << " or longer" << endl;for_each(wc, wordVec.end(), [](const string& s) { cout << s << " "; });return 0;
}

輸出結果:

4 words of length4 or longer
jnmp slow over quick						  //for_each后對應的值
  • 版本二

    	ostream& os = cout;char c = ' ';for_each(wordVec.begin(), wordVec.end(),for_each(wc, wordVec.end(),[&os, c](const string& s){ os << s << c; });
    
    • 輸出

      the red fox the red jnmp slow over quick------------
      jnmp slow over quick
      
  • 版本三 隱式捕獲

  • & = ,&告訴編譯器采用捕獲應用的方式,=表示采用值捕獲的方式

    //sz 為隱式捕獲,值捕獲方式
    auto wc = find_if(wordVec.begin(), wordVec.end(),[=](const string& a){return a.size() >= sz; });
    
  • 版本四 一部分變量采用值捕獲,其他變量采用引用捕獲,可以混合使用引用捕獲和顯示捕獲

    //os 隱式捕獲,引用捕獲方式;c為顯示捕獲,值捕獲方式
    for_each(wc, wordVec.end(),[&, c](const string& s){ os << s << c; });
    //os 為顯示捕獲,引用捕獲方式;c隱式捕獲,值捕獲方式
    for_each(wc, wordVec.end(),[=, &os](const string& s){ os << s << c; });
    

總結

以上是生活随笔為你收集整理的【C++】lambda 表达式的全部內容,希望文章能夠幫你解決所遇到的問題。

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