不能在 `std::generate` 中使用 lambda。我哪里搞砸了?
Can't use lambda inside `std::generate`. Where did I mess up?
我得到以下代码,它应该用给定 n
的二项式系数填充 std::vector<int>
(见下文)。
我认为 binomial
函数没有错,因为它做了它应该做的事情。
我收到的错误信息如下:
In file included from /usr/include/c++/9/algorithm:62,
from <file>.cpp:3:
/usr/include/c++/9/bits/stl_algo.h: In instantiation of ‘void std::generate(_FIter, _FIter, _Generator) [with _FIter = __gnu_cxx::__normal_iterator<int*, std::vector<int> >; _Generator = int]’:
<file>.cpp:38:57: required from here
/usr/include/c++/9/bits/stl_algo.h:4469:18: error: ‘__gen’ cannot be used as a function
4469 | *__first = __gen();
| ~~~~~^~
#include <iostream>
#include <vector>
#include <algorithm>
#include <functional>
template <typename T>
std::ostream &operator<<(std::ostream &os, const std::vector<T> v)
{
os << "<";
std::for_each(v.begin(), v.end(), [&](T x) -> void { os << " " << x << " "; });
os << ">";
return os;
}
int main()
{
int n;
std::cin >> n;
int cnt{0};
std::vector<int> v(n + 1);
std::function<int(int, int)> binomial = [&binomial](int n, int k) -> int {
if (k == 0 || k == n)
return 1;
if (k == 1)
return n;
return (binomial(n - 1, k - 1) + binomial(n - 1, k));
};
std::generate(v.begin(), v.end(), binomial(n, cnt++));
std::cout << v << std::endl;
}
感谢您的帮助!
generate
需要一个不带参数的可调用对象:
std::generate(v.begin(), v.end(), [&]{ return binomial(n, cnt++); });
我得到以下代码,它应该用给定 n
的二项式系数填充 std::vector<int>
(见下文)。
我认为 binomial
函数没有错,因为它做了它应该做的事情。
我收到的错误信息如下:
In file included from /usr/include/c++/9/algorithm:62,
from <file>.cpp:3:
/usr/include/c++/9/bits/stl_algo.h: In instantiation of ‘void std::generate(_FIter, _FIter, _Generator) [with _FIter = __gnu_cxx::__normal_iterator<int*, std::vector<int> >; _Generator = int]’:
<file>.cpp:38:57: required from here
/usr/include/c++/9/bits/stl_algo.h:4469:18: error: ‘__gen’ cannot be used as a function
4469 | *__first = __gen();
| ~~~~~^~
#include <iostream>
#include <vector>
#include <algorithm>
#include <functional>
template <typename T>
std::ostream &operator<<(std::ostream &os, const std::vector<T> v)
{
os << "<";
std::for_each(v.begin(), v.end(), [&](T x) -> void { os << " " << x << " "; });
os << ">";
return os;
}
int main()
{
int n;
std::cin >> n;
int cnt{0};
std::vector<int> v(n + 1);
std::function<int(int, int)> binomial = [&binomial](int n, int k) -> int {
if (k == 0 || k == n)
return 1;
if (k == 1)
return n;
return (binomial(n - 1, k - 1) + binomial(n - 1, k));
};
std::generate(v.begin(), v.end(), binomial(n, cnt++));
std::cout << v << std::endl;
}
感谢您的帮助!
generate
需要一个不带参数的可调用对象:
std::generate(v.begin(), v.end(), [&]{ return binomial(n, cnt++); });