Iterator - .end() zeigt auf das Element 'HINTER' dem letzten Element
-
Wie ist das zu verstehen, das .end() auf das Element 'HINTER' dem letzten zeigt. Ich mein "hinter dem letzten Element" kanns doch kein weiters mehr geben? Auf was zeigt es dann? Ich versteh schon wie mans anwendet, nur mir das vorzustellen is bissel schwierig. Kann mir jemand auf die Sprünge helfen?
MfG
Stromberg
-
beispiel an einem array:
6 elemente:
int arr[6] = {0,1,2,3,4,5}; int * p = arr + 0; int * e = arr+6; for(int cnt = 0;p != e; ++p,++cnt) { std::cout << "[" << cnt << "] = " << *p << std::endl; }p e | | V V [0][1][2][3][4][5][6][0] = 0
p e | | V V [0][1][2][3][4][5][6][1] = 1
p e | | V V [0][1][2][3][4][5][6][2] = 2
p e | | V V [0][1][2][3][4][5][6][3] = 3
p e | | V V [0][1][2][3][4][5][6][4] = 4
p e | | V V [0][1][2][3][4][5][6][5] = 5
pe || VV [0][1][2][3][4][5][6]Nun e zeigt auf das nicht existierende element 7 (welches hinter dem letzten element des arrays liegt)
nun schau dir mal die Algorithmen in der STL an, die verwenden sehr oft 2 iteratoren
start und ende, wobei ende niemals auf einen zu bearbeitenden Wert zeigen wird.
std::sort(p,e);
std::unique(p,e);und so weiter
Leider fällt mir jetzt keine gute Beschreibung ein
-
Stromberg schrieb:
Wie ist das zu verstehen, das .end() auf das Element 'HINTER' dem letzten zeigt. Ich mein "hinter dem letzten Element" kanns doch kein weiters mehr geben? Auf was zeigt es dann? Ich versteh schon wie mans anwendet, nur mir das vorzustellen is bissel schwierig. Kann mir jemand auf die Sprünge helfen?
MfG
StrombergAuf was der Iterator zeigt ist unterschiedlich. In einem Array zeigt er einfach auf die nächste Speicherzelle hinter dem array, also fremden Speicher.
In einer Liste oder einem Baum gibt es oftmals sogar ein echtes "end"- Element. Das ist dann das Element hinter dem letzten Datenelement.In der Theorie ist das aber nicht von belang. Du musst dir Container für die iteratordarstellung wie Warteschlangen vorstellen. Wenn du vorne ein Schild stehen hast: hier beginnt die Schlange, dann steht hinten ein Schild: hier bitte anstellen. Das erste Schild ist der begin() iterator, das schild am Ende der end("hier ist die position an der sich der nächste stellen müsste, der sich anstellen will").