欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

c/c++ lambda 表达式 介绍

程序员文章站 2022-10-05 11:13:53
lambda 表达式 介绍 问题:假设有个需求是,在vector\找出所有长度大于等于4的元素。标准库find_if函数的第三参数是函数指针,但是这个函数指针指向的函数只能接受一个参数,这个参数是vector\里的元素。这时问题就来了,长度4无法作为参数传递, 肿么办??? 解决办法:使用lambd ......

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