c++基础(lambda)

作者: zidea | 来源:发表于2019-05-02 16:09 被阅读13次
    Cplusplus-tutorial-in-hindi.jpg

    在 c++ 中 lambda 函数有点类似匿名函数,怎么解释呢,我们无需定义一个函数结构随后再去使用这个函数。而是直接在使用时将其声明使用。

    再进一步解释可以将函数赋值给变量,然后通过变量再去调用函数。我们学习一个新特性不是如何使用这个语法,而是在什么场景下恰当地去使用这个语法来解决实际问题。不要为了特效而改变故事情节,一个好的程序在其情节而不是特效。所以不要为了用而用。
    lambda 是字面上定义一个函数而不是持有一个函数。也就是我们可以使用函数指针的场景是可以使用 lambda 来代替的。参照 c++ 基础(函数指针)

    #include <iostream>
    #include <vector>
    #include <algorithm>
    
    
    void ForEach(const std::vector<int> &values, void (*func)(int))
    {
        for (int value : values)
            func(value);
    }
    
    int main(int argc, char const *argv[])
    {
        std::vector<int> values = {1, 2, 3, 2, 1};
        ForEach(values, [](int value) { std::cout << "value: " << value << std::endl; });
        std::cin.get();
    }
    

    定义void ForEach(const std::vector<int> &values, void (*func)(int))接收两个参数一个vector<int>动态数组,一个是指针函数作为参数。在调用函数ForEach时候第二个参数我们传入一个[](int value) { std::cout << "value: " << value << std::endl; }一个 lambda 作为第二参数传入到函数ForEach中。void (*func)(int)定义传入lambda的格式是返回值为void接收一个int类型的参数。
    在循环体中的func(value)会调用lambda函数。

    • 注意以为c++11之后才对 lambda 进行支持,所以编译时候需要支持 c++11 进行编译。
    g++ -std=c++11 lambda1.cpp -o lambda1
    
        auto lambda = [](int value) { std::cout << "value: " << value << std::endl; };
        ForEach(values, lambda);
    

    大家感觉陌生和疑惑可能是[],今天对这个解释一下,看了一些有关[]解释的参考资料,感觉和之前学习的 angularjs 中有关 directive 变量定义内部是对外的引用、还是复制的=,& 符号含义有点相似,这些符号主要传入到 directive 的变量是传值还是传引用。可能是 angularjs 设计者参考c++的做法了吧。

    在 c++ 中[]lambda的捕获区,用于捕获外部变量,我们可以看一看。

    int a = 5;
        auto lambda = [=](int value) { std::cout << "value: " << a << value << std::endl; };
    
    • = 表示传值
    • & 表示传入引用
    • [&a] 表示传入 a 变量的引用,而[a]表示传入值。
    void ForEach(const std::vector<int> &values, const std::function<void(int)> &func)
    {
        for (int value : values)
            func(value);
    }
    
    int main(int argc, char const *argv[])
    {
        std::vector<int> values = {1, 2, 3, 2, 1};
        int a = 5;
        auto lambda = [=](int value) { std::cout << "value: " << a << value << std::endl; };
        ForEach(values, lambda);
        std::cin.get();
    }
    

    这里我们需要修改第二个参数传入的类型const std::function<void(int)> &func

     auto lambda = [=](int value) { a= 5; std::cout << "value: " << a << value << std::endl; };
    

    如果想要在lambda表达式中修改传入的变量a,就需要使用 lambda 表达式中添加 一个mutable的说明符。

    auto lambda = [=](int value) mutable { a= 6; std::cout << "value: " << a << value << std::endl; };
    

    下面看一个 lambda 的具体应用,在algorithm库中提供了find_if 函数最后一个参数接收函数作为参数,我们可以传入一个 lambda 表达式来作为参数。

        auto it = std::find_if(values.begin(), values.end(), [](int value) { return value > 2; });
        std::cout << *it << std::endl;
    

    相关文章

      网友评论

        本文标题:c++基础(lambda)

        本文链接:https://www.haomeiwen.com/subject/hxpnnqtx.html