c/c++ lambda 表達式 介紹


lambda 表達式 介紹

問題:假設有個需求是,在vector<string>找出所有長度大於等於4的元素。標准庫find_if函數的第三參數是函數指針,但是這個函數指針指向的函數只能接受一個參數,這個參數是vector<string>里的元素。這時問題就來了,長度4無法作為參數傳遞,

腫么辦???

解決辦法:使用lambda。

lambda簡單介紹:多了一個捕獲列表的無名內聯函數。

[capture list] (parameter list) -> return type { function body }

捕獲列表,參數列表(可省略),返回值類型(可省略),函數體。

具體做法:把問題中的長度4作為捕獲列表,把vector<string>里的元素作為參數列表,傳遞個lambda表達式,就解決了上述問題,

完美!!!

#include <iostream>
#include <array>
#include <vector>
#include <algorithm>
#include <list>
#include <deque>
#include <numeric>
#include <forward_list>

using namespace std;

//刪除重復的元素                                                                
void delDups(vector<string> &svec){
  sort(svec.begin(),svec.end());
  auto end_u = unique(svec.begin(),svec.end());
  svec.erase(end_u, svec.end());
}
//自定義的排序規則                                                              
bool shorter(const string s1, const string s2){
  return s1.size() < s2.size();
}
//用lambda作為參數                                                              
void bigger(vector<string> &words,
            vector<string>::size_type sz){
  delDups(words);
  //用lambda作為第三個參數                                                      
  stable_sort(words.begin(), words.end(),
              [](const string &s1, const string &s2){
                return s1.size() < s2.size();
              });
  //把長度參數sz作為捕獲列表,傳遞給lambda表達式
  auto idx = find_if(words.begin(),words.end(),
                     [sz](const string &s){
                       return s.size() >= sz;
                     });
  auto cnt = words.end() - idx;
  cout << cnt << " word's length >= " << sz << endl;
  for_each(idx, words.end(),[](const string &s){
      cout << s << " ";
    });
  cout << endl;
}
int main(){
  //test1 自定義排序算法                                                        
  /*                                                                            
  vector<string> svec{"the","quick","red","fox","jumps",                        
      "over", "the","slow","red","turtle"};                                     
  delDups(svec);                                                                
  //先按長度排序,長度相同的,再用字典順序排序                                  
  stable_sort(svec.begin(),svec.end(),shorter);                                 
  for(const auto &s : svec){                                                    
    cout << s << " ";                                                           
  }                                                                             
  cout << endl;                                                                 
  */

  //test2 用lambda作為參數                                                      
  vector<string> svec{"the","quick","red","fox","jumps",
      "over", "the","slow","red","turtle"};
  bigger(svec, 4);

}

c/c++ 學習互助QQ群:877684253

本人微信:xiaoshitou5854


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM