2010-05-16 4 views

Antwort

7

Ja, das ist in Ordnung. So ist die VC10-Implementierung der Iteratoren für vector strukturiert. Siehe _Vector_iterator und _Vector_const_iterator in <vector>.

Übrigens ist es schwierig, Iteratoren zu schreiben. Es lohnt sich, die boost :: iterator-Bibliothek zu lernen und zu verwenden.

+0

Ich weiß, aber in meinem Fall ist es eine kleine Bibliothek und ich will nicht, dass es von irgendetwas abhängt, einschließlich Boost-Teile. – doublep

+0

Es ist schon gut, dass manche Implementierung von STL so funktioniert. Kennen Sie zufällig eine Klausel im Standard, die Iteratoren und Anforderungen allgemein beschreibt? – doublep

+0

24.2 des FCD (n3035.pdf) beschreibt Iteratoren und ihre Anforderungen –

0

Denken Sie über einen Fall nach, bei dem Sie die Iteratormitglieder ändern müssen.

+4

Und? Ich denke, du musst es ausarbeiten. – doublep

2

Subclassing scheint mir hier seltsam, aber es gibt tatsächlich ein Problem.

Auch wenn Sie nicht auf Boost-Teile angewiesen sein möchten, überprüfen Sie die Boost.Iterator-Bibliothek und insbesondere die iterator_facade und iterator_adaptor Bits.

Es gibt ein vollständiges Beispiel, wie man einen iterator und einen const_iterator für Ihre Klasse schreibt, ohne zu viel zu kopieren. Ihre Idee ist es, eine Vorlage iterator_base Klasse zu schreiben, die Sie dann für const und nicht-const-Typen in der Zeile verwenden:

template <class Value> class iterator_base; 

typedef iterator_base<T> iterator; 
typedef iterator_base<const T> const_iterator; 

Das Problem mit Subclassing ist, dass man dann einen virtuellen Destruktor bereitstellen sollte und du bist ausgesetzt zu schneiden (beim Aufbau eines const_iterator von einem iterator)

Also, im Gegensatz zu anderen hier, ich finde es nicht "gut".

+2

"Sie sollten dann einen virtuellen Destruktor bereitstellen" - aber meine Destruktoren tun sowieso nichts. Selbst wenn sie dies tun würden, würde der Typ "iterator" wahrscheinlich nur den "const_iterator" -Destruktor erben, ohne etwas extra zu tun. "Sie sind dem Schneiden ausgesetzt" - können Sie bitte näher ausführen, ich verstehe nicht, was Sie hier meinen. – doublep

+1

Ein Beispiel für das Slicen, 'iterator it; const_iterator cit = statischer_cast (it); '. Wenn Sie den Typ "it" auf "cit" stellen, werden alle zusätzlichen Variablen, die Sie zu "it" hinzugefügt haben, nicht in "cit" kopiert. Aber ich denke, das ist in Ordnung, da wir nie wieder zum "Iterator" zurückgehen können. – Hindol