我实现了一个迭代器,它有Fibonacci数作为输出。在我的主要()中,我想找到一个可分数为17的数字(它是34)。为什么我的find_if语句不起作用。
谢谢!
#include <boost/operators.hpp>
#include <algorithm>
#include <tr1/functional>
struct FibIter: boost::input_iterator_helper<FibIter,unsigned long long> {
//typedef value_type unsigned long long;
FibIter(value_type l=0):counter(0), fib0(0),fib1(1){
while(l!=counter)
++(*this);
}
value_type operator*() const {return fib0;}
FibIter& operator++() {
++counter;
value_type fnew = fib0+fib1;
fib0 = fib1;
fib1 = fnew;
return *this;
}
bool operator==(FibIter const &other)const {
return counter == other.counter;
}
private:
value_type counter;
value_type fib0, fib1;
};
using namespace std;
using namespace tr1;
using namespace placeholders;
int main() {
FibIter found = find_if(FibIter(), FibIter(100),bind(not2(modulus<unsigned long long>()),_1,17ULL));
}
答案 0 :(得分:0)
bind(not2(modulus<unsigned long long>()),_1,17ULL)
应该是
not1(bind(modulus<unsigned long long>(),_1,17ULL))
答案 1 :(得分:0)
我想如果从第一个数字0开始,find会返回它(模数(0,17)= 0 )。
答案 2 :(得分:0)
好的我用!boost :: bind(...)而不是tr1 :: bind。
来解决它答案 3 :(得分:0)
首先,您可以在构造函数中使用std::advance(*this,l);
而不是while
循环。但!你的方法非常低效,因为它需要计算斐波那契序列两次:一个知道什么是最后一个斐波那契数,第二个实际到达那里{{1客户端代码使用它。
我认为更好的方法是将构造函数中的++
Fibonacci数的索引存储在私有成员中,并在每个last
之后将计数器与它进行比较。它可以通过这样的方式从已存在的++
字段中重用:
让默认构造函数将Fibonacci迭代器初始化为index
和fib0 = 0
以及fib1 = 1
。另一个构造函数(参数)将创建一个虚拟迭代器,它只包含序列的最后一个索引,其他字段无效。这一个迭代器将是“一个接一个”的迭代器,仅用于索引比较,而不是读取值。
所以这是我的解决方案:
index = 0
输出:
#include <iterator>
class Fibonacci : public iterator<input_iterator_tag, int>
{
unsigned index;
value_type fib0, fib1;
public:
Fibonacci(): index(0), fib0(0), fib1(1) { }
explicit Fibonacci(unsigned last): index(last), fib0(0), fib1(0) { }
bool operator == (const Fibonacci& other) { return index == other.index; }
bool operator != (const Fibonacci& other) { return !(*this == other); }
value_type operator * () const { return fib0; }
Fibonacci& operator ++ () {
++index;
value_type fnew = fib0 + fib1;
fib0 = fib1; fib1 = fnew;
return *this;
}
Fibonacci operator ++ (int) {
Fibonacci current(*this);
++(*this);
return current;
}
};
#include <iostream>
#include <algorithm>
int main()
{
using namespace std;
ostream_iterator<int> out(cout, "; ");
cout << "Fibonacci numbers from 0th to 19th:\n";
copy(Fibonacci(), Fibonacci(20), out);
cout << endl;
}
正如您所看到的,在我的示例中还有更多的代码重用:我通过调用它们来重用其他运算符中的运算符。
当然它仅适用于符合Fibonacci numbers from 0th to 19th:
0; 1; 1; 2; 3; 5; 8; 13; 21; 34; 55; 89; 144; 233; 377; 610; 987; 1597; 2584; 4181;
的数字。最好将其重写为使用多个精确数字(例如GMP库)。