59.lambda in C++
lambda本质上是我们定义的一种叫做匿名函数的方式。我们可以用这种方式简易的创建一个函数,而不需要真的实际创建一个函数,就像一个快速的一次性函数
lambda更像是一种变量,在实际编译的代码中作为一个符号存在,而不是像正式的函数那样。
🍅lambda用法
只要你有一个函数指针,你都可以在C++中使用lambda,这就是它的工作原理
故lambda的用法是:在设置函数指针指向函数的任何地方,我们都可以将他设置未lambda
[]( {参数表} ){ 函数体 }
void ForEach(const std::vector<int>& values, void(*function)(int)) {
for (int temp : values) {
function(temp); //正常调用lambda函数
}
}
int main() {
std::vector<int> valus = { 1, 2, 3, 4, 5 };
//函数指针的地方都可以用auto来简化操作,lambda亦是
//这样子来定义lambda表达式会更加清晰明了
auto lambda = [](int val){ std::cout << val << std::endl; }
ForEach(values, lambda);
}
lambda中的中括号表示的是捕获
-
lambda可以使用外部(相对)的变量,而
[]
就是表示打算如何传递变量#include <functional> //要用捕获就必须要用C++新的函数指针! //新的函数指针的签名有所不同! void ForEach(const std::vector<int>& values, const std::function<void(int)>& func) { for (int temp : values) { func(temp); } } int main() { std::vector<int> valus = { 1, 2, 3, 4, 5 }; //注意这里的捕获必须要和C++新带的函数指针关联起来!!! int a = 5; //如果lambda需要外部的a向量 //则在捕获中写入a就好了 auto lambda = [a](int val){ std::cout << a << std::endl; } ForEach(values, lambda); }
注意这里
[a]
是值传递,如果是[&a]
就是引用传递- 💡如果是
[=]
,则是将所有变量值传递到lambda中 - 💡如果是
[&]
,则是将所有变量引用传递到lambda中
- 💡如果是
-
它可以有0个或者多个捕获
-
(捕获区域)能够传入变量(可作为拷贝or引用or值被捕获
🍅为何想用lambda
**find_if
**是一个搜索类的函数,区别于find
的是:它可以接受一个函数指针来定义搜索的规则,返回满足这个规则的第一个元素的迭代器。这个情况就很适合lambda表达式的出场了
#include <functional> //要用捕获就必须要用C++新的函数指针!
//新的函数指针的签名有所不同!
#include <algorithm>
void ForEach(const std::vector<int>& values, const std::function<void(int)>& func) {
for (int temp : values) {
func(temp);
}
}
int main() {
std::vector<int> valus = { 1, 2, 3, 4, 5 };
//下面就用到了lambda作为函数指针构成了find_it的规则
auto it = std::find_if(values.begin(), values.end(), [](int value) { return value > 3; }); //返回第一个大于3的元素的迭代器
std::cout << *it << std::endl; //将其输出
}
如果是这样的话,对于sort
也不必要去大老远写一个cmp
了,直接写一个lambda表达式就可以了👌