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

内容来源于网络如有侵权请私信删除
你还没有登录,请先登录注册
  • 还没有人评论,欢迎说说您的想法!