今天在做题目 https://leetcode-cn.com/problems/climbing-stairs/ 的时候发现有人的答案是这样写的:
#include <vector>
#include <functional>
class Solution {
public:
int climbStairs(int n) {
if (n < 0) return 0;
std::vector<int> vec = {0,1,2,3};
if (n > 3) vec.resize(n+1, -1);
std::function<int(int)> fib = [&](int n)
{
if (vec[n] == -1)
vec[n] = fib(n-1) + fib(n-2);
return vec[n];
};
return fib(n);
}
};
和自己之前学的lamda表达是好像有点不太一样,lamda一般都是这样写的:
auto add_x = [x](int a){return a+x;};
auto multipy_x = [&x](int a){return a*x;};
查理一下 https://www.cnblogs.com/yyxt/p/3987717.html 原来是C++11 的function对象:
function<int(int)> fib = [&](int n)
其中的<int(int)>
说明返回值是一个int,传入的参数也是int,int传入的形参是n
- []:默认不捕获任何变量;
- [=]:默认以值捕获所有变量;
- [&]:默认以引用捕获所有变量;
- [x]:仅以值捕获x,其它变量不捕获;
- [&x]:仅以引用捕获x,其它变量不捕获;
- [=, &x]:默认以值捕获所有变量,但是x是例外,通过引用捕获;
- [&, x]:默认以引用捕获所有变量,但是x是例外,通过值捕获;
- [this]:通过引用捕获当前对象(其实是复制指针);
- [*this]:通过传值方式捕获当前对象;