Iterator vs. Circulator
-
Klappt denn for(it = bla.begin(); it != bla.end(); ++i) auch für den Ring-Iterator?
-
Nein denn es gibt ja kein Ende. Ändert aber nicht dran dass es ein Iterator ist

-
Aber bei einem iterator versuche ich diese Schleife zu benutzen, was für mich ein Argument dafür ist, es circulator zu nennen, damit ich mich erst am Namen stoße, bevor ich die Schleife probiere.
-
dot schrieb:
Nein denn es gibt ja kein Ende.
Ich würde sagen, das hängt von der Implementierung ab. Ansonsten stimme ich Eisflamme zu: Wenn ich damit kein For-Each machen kann, soll es kein Iterator sein.
-
Nexus schrieb:
dot schrieb:
Nein denn es gibt ja kein Ende.
Ich würde sagen, das hängt von der Implementierung ab. Ansonsten stimme ich Eisflamme zu: Wenn ich damit kein For-Each machen kann, soll es kein Iterator sein.
Aber ich KANN!
Nur sollten die herauslockenden Funktiionen nicht begin() und end() sein.
Mit begin() und end() laufe ich genau einmal über alle Elemente.
Mit circusBegin() und circusEnd() laufe ich endlos.
circusBegin() kann natürlich einen circular oder circularIterator zurückgeben, es kann auch ein iterator sein, im Falle des Ringbuffers ist das angemessen. circusEnd() gibt am besten einen neverBeingEqualIteratorStubProxyPatternMemberImpersonatingType<decltype(circusBegin())> zurück, den selbst der dümmste Compiler zur Compilezeit bei jedem Vergleich mit == gegen einen decltype(circusBegin()) als ungleich erkennen kann.
Und der Benutzer muß circusEnd() nicht verwenden, ist ja eh zwecklos, er kann auch eine Endlosschleife nehmen, aber er kann auch circusEnd() verwenden, um mit manchen stl-Algorithmen zu arbeiten.Aber irgendwie gefällt es mir nicht. Hab wohl zu viel mit Ranges und Generatoren gemacht.
-
Das Interator Konzept hat doch nichts damit zu tun ob es einen Anfang oder ein Ende gibt, Anfang und Ende selbst werden in diesen Fällen über Iteratoren markiert!? Ich versteh nicht ganz was die Frage ob etwas ein Iterator ist oder nicht mit foreach zu tun hat. Ein Iterator ist einfach ein Objekt mit dem ich einen Container durchlaufen kann. Wenn der Container zirkulär ist lauft der Iterator halt im Kreis. Du kannst dir ja merken von wo du losgelaufen bist wenn du nur einmal durchlaufen willst.
-
Bei iterator projeziert sich mir halt die begin() -> end() Durchiteration in Form obiger Schleife in meinen Kopf. Wenn die nicht geht, ist schon viel vom Iterator für mich weg.
-
Eisflamme schrieb:
Klappt denn for(it = bla.begin(); it != bla.end(); ++i) auch für den Ring-Iterator?
Es gibt kein bla.begin() und bla.end(). Die Daten sind ringförmig miteinander
verpointert, so daß man von einem Element zum nächsten springen kann.lg
-
Und wenn man nur den Container und kein Element davon hat? Wie fängt man dann an zu iterieren?
-
Das Anfangen ist jetzt nicht das Problem.
Eher das Aufhören, allerdings auch nur dann, wenn man a) mit halb-offenen Ranges arbeiten will und b) über alle Elemente drüberiterieren will.
Wobei man sich dazu evtl. auch ein paar unsaubere Tricks einfallen lassen könnte, wenn es denn unbedingt sein muss.Was den Namen angeht ... "circular iterator" wäre naheliegend, nen?

-
Eisflamme schrieb:
Und wenn man nur den Container und kein Element davon hat? Wie fängt man dann an zu iterieren?
Der Container hat eine Memberfunktion 'getIterator()', die einen Iterator auf
ein beliebiges Element zurückliefert. Ist der Container leer, so ist er nicht
gültig. Das muß der User prüfen. Im Debug-Mode fliegt eine Assertion.