zoukankan      html  css  js  c++  java
  • C++11:07lambda表达式

    lambda表达式

    0、课前秀

    • 应该在其它语言中听过lambda表达式这个词,来自数学概念λ演算 ,本质是个匿名函数

    1、lambda表达式的概念和基本用法

    • 语法形式:[capture] (params) opt -> ret {body;}
      • capture:捕获列表
      • params:参数
      • opt:函数选项 这个没懂呢--lionel
      • ret:返回值类型
      • body:函数体
    • 完整的lambda表达式:auto f = [](int a) ->int {return a+1;};
      • 调用std::cout<<f(1)<<std::endl;//输出2
    • 省略的lambda表达式:
      • 省略(或默认)是把双刃剑
    • 参数列表为空可省略auto f1 = [](){return 1;}; 等价于auto f2 = []{return 1;};
    • 捕获列表的变量:
      • []不捕获任何变量
      • [&]捕获外部作用域中所有变量,并作为引用在函数体中使用(按引用捕获)
      • [=]捕获外部作用域中所有变量,并作为副本在函数体中使用(按值捕获)
      • [=,&foo]按值捕获外部作用域中所有变量,并按引用捕获foo变量。
      • [bar]按值捕获bar变量,同时不捕获其他变量
      • [this]捕获当前类中的this指针,让lambda表达式拥有和当前类成员函数同样的访问权限。如果已经作用了&或者=,就默认添加此选项。捕获this的目的是可以在lambda中使用当前类的成员函数和成员变量。

    2、声明式的编程风格、简洁的代码

    • 仿函数实现
    class CountEven
    {
        int& count_;
        public:
        CountEven(int& count):count_(count)
        {   
        }
        
        void operator()(int val)
        {
            if(!(val & 1)) //val % 2 == 0
            {
                ++ count_;
            }
        }
    };
    
    std::vector<int> v = {1,2,3,4,5,6};
    int even_count = 0;
    for_each(v.begin(), v.end(), CountEven(even_count));
    std::cout << "The number of even is "<<even_count<<std::endl;
    
    • 用lambda替换仿函数(functor
    std::vector<int> v = {1,2,3,4,5,6};
    int even_count = 0;
    for_each(v.begin(), v.end(),[&even_count](int val)
             {
                 if(!(val & 1))  //val %2 == 0
                 {
                     ++ even_count;
                 }
             });
    

    3、在需要的时间和地点实现闭包,使程序更灵活

    ReadMe

    • 20200424第1版:《深入应用C++11》1.6的内容
      • 1.6.3的内容没太看,以为1.5节的知识不重要,缺少这个知识基础了
  • 相关阅读:
    基于java容器注解---基于泛型的自动装配
    mininet+floodlight搭建sdn环境并创建简单topo
    Bean装配之@Autowired注解
    Linux常用命令
    Bean利用Resource接口获取资源的几种方式
    MYSQL分页优化查询
    MYSQL统计和识别重复值
    MYSQL统计和识别重复值
    MYSQL处理数据重复值
    MYSQL处理数据重复值
  • 原文地址:https://www.cnblogs.com/fewolflion/p/12777448.html
Copyright © 2011-2022 走看看