N
void_0815 schrieb:
Ich habe nun den Vorschlag von Nexus aufgegriffen und einen eigenen Iterator implementiert:
template <class Vector, class ValueType = Vector::value_type> class TIteratorVector
{
public:
TIteratorVector( typename Vector::iterator& beginIterator, typename Vector::iterator& endIterator );
// Iterator auf den Anfang setzen.
void begin( );
// Iterator auf das Ende setzen.
void end( );
// Iterator inkrementieren.
void operator++( );
// Iterator dekrementieren.
void operator--( );
// Pruefen ob der Anfang erreicht wurde.
bool getBeginReached( ) const;
// Pruefen ob das Ende erreicht wurde.
bool getEndReached( ) const;
// Das aktuelle Element zurueckgeben.
typename ValueType getElement( );
private:
// Begin Iterator.
typename Vector::iterator m_beginIterator;
// End Iterator.
typename Vector::iterator m_endIterator;
// Aktueller iterator.
typename Vector::iterator m_currentIterator;
};
Abgesehen von den Operatoren ++ und -- hat deine Klasse nichts mehr mit einem Iterator gemeinsam (aber selbst diese haben wegen void als Rückgabetyp eine ungewöhnliche Semantik). Ein Iterator ist eine Abstraktion eines Zeigers und weiss nichts über die Sequenz, also auch nichts über deren Beginn und Ende. Du packst zu viel Funktionalität in eine Klasse und schränkst dich damit zu stark ein. Die STL trennt Container, Algorithmen und Iteratoren absichtlich, um die Generizität und Modularität zu erhöhen. Ich rate dir dasselbe, wobei du nur einen Iterator implementieren musst. Orientiere dich doch an meinem verlinkten Beispiel.
Die Methoden begin() , end() , getBeginReached() , getEndReached() und getElement() würde ich weglassen, dafür operator* , operator-> , operator++(int) , operator--(int) , operator== und operator!= anbieten, also eine intuitive Iterator-Schnittstelle, wie man sie von der STL kennt.
Übrigens ist Base ein ziemlich schlecht gewählter Name für die abgeleitete Klasse.