zoukankan      html  css  js  c++  java
  • lambda 表达式

    C++0x 的语法还是比较简单。下面通过几个例子来介绍下。

    先是通过 std::for_each 演示一个简单的例子:

    std::for_each 和 lambda
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    #include <iostream>
    #include <vector>
    #include <algorithm>
     
    int main() {
     
        std::vector<int> my_vector({1, 2, 3, 4 ,5});
     
        std::for_each(my_vector.begin(), my_vector.end(),
                [](int value) { std::cout << value << std::endl; });
     
     
        return 0;
    }

    首先,是不是发现 my_vector 的构造函数怪怪的呢。因为C++0x支持一种从C带来的初始化列表概念,

    语法类似于 C 的 int array[] = {1, 2, 3, 4 ,5}。关于这个详细介绍,有机会下次再介绍

    1.Lambda 的格式

    对于这里的 lambda:[](int value) { std::cout << value << std::endl; }

    从这里看出,lambda 是以 [] 开头的匿名函数。这个lambda 仅仅把参数打印出来,是一个 void 的函数。

    对于需要返回值的 lambad,格式如下:[](int a, int b) { return a + b;}

    在这里,返回值的类型是 decltype(a + b),decltype是一个新关键词,用于在编译期推导出类型。

    如果想强制设定返回值类型,可以这样编写:[](int a, int b) -> int { return a + b;}

    这里把返回值设置为 int 型。

    2. [] 的表示方式

    C++ 的 lambad 是支持闭包的。那么,是通过 [] 来表示 lambda 的变量集合,即闭包。

    []的表示
    1
    2
    3
    4
    5
    6
    7
    8
    [] //没有定义变量,使用未定义的变量会导致错误。
    [a, &b] //a以传值方式传入,b以引用方式传入
    [&] // 表示在 lambda所使用到的变量,皆以引用方式传入
    [=] // 表示在 lambda所使用到的变量,皆以传值方式传入
    [&, a] //表示 a 以传值方式传入,其他都是以引用方式传入
    [=, &a] // 表示 a 以引用方式传入,其他都是以传值方式传入
     
    如果企图修改以值传入的变量,则编译的时候会报错(gcc 4.5)

    下面来看看一个闭包的lambda例子:

    lambda的闭包
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    #include <iostream>
    #include <vector>
    #include <algorithm>
     
    int main() {
     
        std::vector<int> my_vector({1, 2, 3, 4 ,5});
     
        int total = 0;
     
        std::for_each(my_vector.begin(), my_vector.end(),
            [&total](int value) {
                total++;
            });
     
        std::cout << "total:" << total << std::endl;
     
        return 0;
    }

    这里的输出结果是: total:5

    3.涉及 this 指针的使用

    在成员函数中涉及到对象的 this 指针,必须显式地传入lambda函数,否则成员函数的lambda函数无法使用任何对象的变量或者函数,格式如下:

    [this]() { this->call_function(); }

  • 相关阅读:
    js 时间戳格式化
    有关Safari 浏览器的文章
    前端图片旋转动画
    vue中textarea标签自适应高度
    pip 报错 Fatal error in launcher: Unable to create process using
    HTML列表多点击事件
    js获取浏览器版本信息
    SVG圆形进度条
    基于蚂蚁金服"AntDesignVue-Menu导航菜单"实现根据初始路由自动选中对应菜单解决刷新后菜单选择状态丢失问题(支持根路径菜单)
    java根据权重进行排序
  • 原文地址:https://www.cnblogs.com/MrGreen/p/3269213.html
Copyright © 2011-2022 走看看