C语言程序员程序园

c++基础(lambda)

2019-05-02  本文已影响13人  zidea
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函数。

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; };
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;
上一篇下一篇

猜你喜欢

热点阅读