在 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;
网友评论