Fibonacci Zahlen
-
Konrad Rudolph schrieb:
Und dass Dir als Javaner Operatorenüberladung nicht passt ist zwar verständlich, aber ich denke, Du solltest Dich damit (zumindest in C++) anfreunden, das Konzept ist sehr mächtig.
Irgendwie ist heute nicht mein Tag. Schon innerhalb von 5 Minuten
das zweite Mal mißverstanden.
Ich habe doch nirgendwo geschrieben, daß mir Operatorenüberladung
nicht paßt!Im Gegenteil: Sie gehört zu den Aspekten (const-Modifier, Referenzübergabe, ...)
die ich in Java vermisse.
-
Javaner schrieb:
Ich habe doch nirgendwo geschrieben, daß mir Operatorenüberladung
nicht paßt!Oh, irgendwie hatte ich das in Deine Aussage "Aber operator hört sich genauso nichtssagend an wie Functor" reininterpretiert. Tut mir leid.
-

Nicht einfach sich im Feindesland zu bewegen.

-
.filmor schrieb:
Ich will auch noch eine Art loswerden

[Code als Iterator]
Keine Ahnung, obs funktioniert, aber ich finds toll ;).Nö, klappt nicht, aber da ich die Idee toll fand, habe ich's auch nochmal versucht:
struct FibIter : public std::iterator<std::input_iterator_tag, int> { FibIter() : n(0), a(0, 1) {} FibIter(int n) : n(n), a(0, 1) {} FibIter& operator ++() { ++n; std::swap(a.first, a.second); a.second += a.first; return *this; } FibIter operator ++(int) { FibIter ret(*this); ++*this; return ret; } int operator *() const { return a.second; } bool operator ==(FibIter const& other) const { return n == other.n; } bool operator !=(FibIter const& other) const { return not (*this == other); } private: std::pair<int, int> a; int n; }; // ... std::copy(FibIter(), FibIter(10), vector.begin());
-
Konrad Rudolph schrieb:
Nö, klappt nicht
Sagen wir mal "nicht ganz". Hier die um die iterator_tags, operator!= und einen funktionierenden operator* erweiterte Variante (bei der allerdings immernoch die erste 1 fehlt ;)):
class fib_iterator : public std::iterator<std::input_iterator_tag, unsigned int> { public: fib_iterator (unsigned int N = 0) : _n (N) { _pred[0] = _pred[1] = 1; } fib_iterator& operator++ () { --_n; _pred[_n % 2] = _pred[0] + _pred[1]; return *this; } unsigned int operator* () { return _pred[(_n - 1) % 2]; } bool operator== (const fib_iterator& other) const { return _n == other._n; } bool operator!= (const fib_iterator& other) const { return !(*this == other); } private: unsigned int _n; unsigned int _pred[2]; };
-
.filmor schrieb:
(bei der allerdings immernoch die erste 1 fehlt ;))
Leicht zu beheben:
unsigned int operator* () { return _pred[(_n - 1) % 2]; }Aus Effizienzgründen könnte man jetzt noch alle Vorkommen von '% 2' durch '& 1' ersetzen.
Lustig, wozu man die C++-Paradigmen so gebrauchen kann.

-
Konrad Rudolph schrieb:
unsigned int operator* () { return _pred[(_n - 1) % 2]; }Dachte ich mir schon. Ich habe einfach ignoriert, dass auf fib_iterator(0) niemals der *-Operator aufgerufen wird :).
Konrad Rudolph schrieb:
Aus Effizienzgründen könnte man jetzt noch alle Vorkommen von '% 2' durch '& 1' ersetzen.
Das macht der gcc von sich aus ;).
Konrad Rudolph schrieb:
Lustig, wozu man die C++-Paradigmen so gebrauchen kann.

Absolut.
-
.filmor schrieb:
Konrad Rudolph schrieb:
Lustig, wozu man die C++-Paradigmen so gebrauchen kann.

Absolut.
Ihr meint doch sicher die OO-Paradigmen!
(ich fühl' mich so ausgegrenzt
)
-
Javaner schrieb:
.filmor schrieb:
Konrad Rudolph schrieb:
Lustig, wozu man die C++-Paradigmen so gebrauchen kann.

Absolut.
Ihr meint doch sicher die OO-Paradigmen!
(ich fühl' mich so ausgegrenzt
)Zurecht :p. Echte Iteratoren gibts in Java nicht, oder?!
-
.filmor schrieb:
Zurecht :p. Echte Iteratoren gibts in Java nicht, oder?!
Genausowenig wie in C++
Aber, wie in C++, kann man sich diese selbst schreiben. Davon wird
auch oft Gebrauch gemacht.