我有一个工作的fibonacci函数,它返回虚拟列表{1,1,1,1,1,1}中的斐波纳契数列表。这是我的代码。
list<int> immutableFibonacci(int position)
{
list<int> oldList(position, int(1));
list<int> newList = accumulate(oldList.begin(), oldList.end(), list<int>{},
[](const list<int> a, int b)
{
list<int> d = a;
if (a.size()<2)
{
d.push_back(1);
}
else
{
auto start = d.rbegin();
auto first = *start;
start++;
auto second = *start;
d.push_back(first + second);
}
return d;
});
return newList;
}
我想传递一个函数的名称,而不是传递lambda表达式[](const列表a,int b)来计算。我该怎么做呢?它基本上是函数immutableFibonacci中的一个函数,但是我在执行此操作时遇到了麻烦。
答案 0 :(得分:1)
而不是:
list<int> newList = accumulate(oldList.begin(), oldList.end(), list<int>{},
[](const list<int> a, int b)
{
list<int> d = a;
if (a.size()<2)
{
d.push_back(1);
}
else
{
auto start = d.rbegin();
auto first = *start;
start++;
auto second = *start;
d.push_back(first + second);
}
return d;
});
以上,并传递一个实际的功能,像这样。你需要函数指针:
list<int> newList = accumulate(oldList.begin(), oldList.end(), list<int>{},
funcname);
//Below is the function
list<int> funcname(list<int> a, int b) {
list<int> d = a;
if (a.size()<2)
{
d.push_back(1);
}
else
{
auto start = d.rbegin();
auto first = *start;
start++;
auto second = *start;
d.push_back(first + second);
}
return d;
}
对于自定义比较器,您可以传递函数指针或lambda,对于您的示例,您使用了lambda。
答案 1 :(得分:1)
感谢您使用我的答案:-) - &gt; How can I use accumulate in C++ to create the Fibonacci sequence?
以下是我的问题解决方案:
#include <iostream>
#include <vector>
#include <numeric>
#include <string>
#include <functional>
auto fibo (std::vector<int>& a, int b)
{
if(a.size()<2)
{
a.push_back(1);
}
else
{
auto start = a.rbegin();
auto first = *start;
start++;
auto second = *start;
a.push_back(first+second);
}
return a;
}
int main()
{
const std::vector<int> v{1, 1, 1, 1, 1, 1, 1, 1, 1, 1};
std::vector<int> s = std::accumulate(v.begin(), v.end(),
std::vector<int>{}, fibo);
std::cout << "Fibo: " <<'\n';
for( auto c : s )
{
std::cout << c << "-";
}
std::cout << '\n';
}
请记住用g++ --std=c++14 fibo.cpp -o fibo
编译。
答案 2 :(得分:0)
您可以在immutableFibonacci函数中创建一个仿函数,如下所示:
struct
{
list<int> operator()(const list<int>& a, int b) const
{
//...then put your lambda code here...
}
} funObj;
然后只使用accumulate函数中的“funObj”名称而不是lambda。就是这样。