Warum wird durch das Entfernen des _first_ Elements einer Liste '.rend ()' ungültig?

8

Getestet unter Mac OS X mit XCode 4.6.

Dieser Beispielcode zeigt das Entfernen des letzten Elements von std::list funktioniert wie erwartet: Ein Iterator-Verweis auf list::end() ist immer noch "1 nach dem Ende" und ist immer noch gültig, sogar durch Entfernen des letzten Elements .

Aber das zweite Beispiel widerspricht meiner Intuition. Wenn Sie das erste Element der Liste entfernen, ändert list::rend() , was ich für "1 nach dem Start" hielt.

War meine Erwartung falsch? Warum war es falsch? Warum bleibt Ihr Verweis auf "1 nach dem Ende" durch Löschen des letzten Elements gültig (wenn nicht?), Aber ein Verweis auf "1 vor dem Anfang ( .rend() ) wird ungültig, nachdem das Frontelement entfernt wurde ?

%Vor%     
bobobobo 07.02.2013, 20:13
quelle

1 Antwort

16

Dies liegt daran, dass ein reverser Iterator eine etwas andere referenzierende Logik als ein regulärer Iterator hat: Er zeigt auf ein Element, aber bei der Dereferenzierung liefert er einen Verweis auf das vorherige Element.

Sie werden dies leicht sehen, wenn Sie Folgendes versuchen:

%Vor%

Die Ausgabe sollte lauten:

%Vor%

Wenn ein umgekehrter Iterator physisch auf ein bestimmtes Element zeigt, zeigt er logisch auf das Element, das ihm vorausgeht. Ein reverser Iterator, der physisch auf das Element in einer Sammlung mit dem Index i zeigt, liefert bei der Dereferenzierung also einen Verweis auf das Element mit dem Index i-1 :

%Vor%

Dies ist der Grund, warum ein Iterator-Rückgabewert von rend() tatsächlich auf das erste Element in einer Sammlung und nicht auf das Element vor dem ersten Element zeigt. Das Entfernen des ersten Elements macht es daher ungültig.

%Vor%

Dies gilt nicht nur für Listen, sondern für alle Sammlungen, die bidirektionale Iteratoren anbieten.

    
Andy Prowl 07.02.2013, 20:23
quelle

Tags und Links