allgemeiner iterator für vector oder list?
-
Hallo Leute
nehmen wir an ich will ein funktion schreiben welche eine list oder einen vector iterieren kann. Wobei der Typ der elemete des liste und vector vom typ double sind
void funktion (???ITERATOR begin, ???? ITERATOR end){ for(?????iterator it= begin; it!= end; it++){ cout << "DAT: " << it << endl; } }
geht sowas?
-
templates?
http://www.cplusplus.com/doc/tutorial/templates.html
(wie kann an einem sowas in diesem Forum einfach so vorbeigehen?)
-
Schau dir z.B. auch mal die STL Algorithmen an.
-
BorisDieKlinge schrieb:
...geht sowas?
Jupp ! Sowas nennt man Compilezeit-Polymorphie... und dafür wurden in C++ ja templates erfunden.
Gruß,
Simon2.
P.S.: Wieder ein wenig zuviel in C gedacht ? :p
-
Und wenn du lieber Laufzeit-Polymorphie hättest (also z.B., wenn diese Funktion sich in einer DLL befindet), kannst du dir einen generischen Iterator-Wrapper schreiben.
-
hä??
wenn ich jetzt
std::vector<double> m_vX; std::list<double> m_lX; funktion(m_vX.begin(),m_vX.end()); funktion(m_lX.begin(),m_lX.end()); void funktion (???ITERATOR begin, ???? ITERATOR end){ for(?????iterator it= begin; it!= end; it++){ cout << "DAT: " << it << endl; } }
macnen will??? gibt nen allg. iterator für beide kontainer?
-
template <typename Iterator> void funktion (Iterator begin, Iterator end) { for (Iterator i = begin; i != end; ++i) { … } }
Es gibt selbstverständlich keinen allgemeinen Iterator, die Iteratoren haben nur die Schnittstelle gemein (das ist der Trick an der Sache ;)).
-
dank, ich stell mich echt blöd an;) thinking C ;)=
-
Wenn du zur Compilezeit noch nicht weißt, ob es eine list oder ein vector ist, dann hast du pech gehabt, weil man das Iteratorpattern eben nicht mit Templates ersetzen kann, obwohl das manche meinen.
-
d.h. es geht nicht?
-
BorisDieKlinge schrieb:
d.h. es geht nicht?
Warum sollte es nicht gehen? Iteratoren bedeuten Polymorphie: du hast das Konzept eines Iterators und es ist dir egal auf was er verweist. In 99% der Faelle sind iteratoren ueber Templates die beste Variante. Manchmal weiss man aber nicht welche Datenstruktur man hat bis das Programm laeuft. Dann braucht man eben runtime polymorphie:
template<typename T> class AbstractIterator { public: virtual void increment()=0; virtual void T& get()=0; //.. }; template<typename T> class VectorIterator : public AbstractIterator<T> { private: typename vector<T>::iterator it; public: void increment() { ++it; } T& get() { return *it; } };
Und schon kann man iteratorentypen erst zur laufzeit herausfinden.
-
Shade Of Mine schrieb:
Und schon kann man iteratorentypen erst zur laufzeit herausfinden.
Und da diese Lösung im Grunde auf der Hand liegt, stellt sich mir die Frage, ob BorisDieKlinge überhaupt jemals seine eigenen Fragen zunächst selbst durchdenkt, bevor sie hier landen.
-
ich hab mir die iteratoren schon angeschaut, und dachte eigentlich das die SLT einen abstrakten iterator habe welcher mit allesn typen zurecht kommt... dies wollt eich hier fragen.. ich hätte dann schon an so einer lösung gearbeite
danke jungs
-
Gehen tut alles, nur das eben nicht mit STL only, da musst du was dazu schreiben.