zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    《MySQL是怎样运行的:从根儿上理解MySQL》笔记4
    《MySQL是怎样运行的:从根儿上理解MySQL》笔记3
    推荐一个对比jar包依赖的工具
    《MySQL是怎样运行的:从根儿上理解MySQL》笔记2
    《MySQL是怎样运行的:从根儿上理解MySQL》笔记1
    查询异步更新状态的一种思路
    springAop:Aop(Xml)配置,Aop注解配置,spring_Aop综合案例,Aop底层原理分析
    java知识点总结
    Maven基础&&Spring框架阶段常用工具类整理
    Idea快捷键整理
  • 原文地址:https://www.cnblogs.com/xiaoshiwang/p/9666962.html
Copyright © 2011-2022 走看看