2009-08-24 7 views
7

Bei assoziativen Containern kann der ++ Operator einen Iterator nach dem Ende einer Sammlung senden?Kann ein STL-Map-Iterator durch Inkrementieren von?

Beispiel:

map<UINT32, UINT32> new_map; 
new_map[0] = 0; 
new_map[1] = 1; 

map<UINT32, UINT32> new_iter = new_map.begin(); 

++new_iter; 
++new_iter; 
++new_iter; 
++new_iter; 
++new_iter; 
++new_iter; 
++new_iter; 

Am Ende dieser, nicht new_iter == new_map.end(), oder ist es in dem großen Unbekannten am Ende?

Hinweis: Ich weiß, das ist durcheinander und nicht die Art und Weise, Dinge zu tun. Ich arbeite an einem WTF-Unternehmenscode.

+1

Also haben Sie es kompiliert und überprüft, ob es am Ende neue_map.end() sein wird? Wahrscheinlich der einfachste Weg, eine Frage wie diese zu beantworten, wenn Sie sich nicht sicher sind. – Goz

+9

@Goz: Nein, das würde nur antworten, was eine Implementierung tut. – sbi

+3

Mögliches Duplikat von [Was passiert, wenn Sie einen Iterator inkrementieren, der dem Enditerator eines STL-Containers entspricht] (https://stackoverflow.com/questions/1057724/what-happens-if-you-increment-an-iterator -that-ist-gleich-zum-Ende-iterator-of-a) – Raedwald

Antwort

11

Voraussetzung für den ++ Operator für einen Vorwärts-Iterator ist, dass der Iterator dereferenceable ist. Dies bedeutet, dass es nicht über das Ende der Map hinausgehen kann, sodass Ihr Code undefiniertes Verhalten ergibt. Dies wird in Abschnitt 24.1.3 des C++ Standards beschrieben.

+0

24.2.3 tatsächlich für den Eingabe-Iterator, 24.2.4 für die Ausgabe. – Ruslan

5

Wie andere darauf hingewiesen haben, verursacht das Inkrementieren des End-Iterators undefiniertes Verhalten. Beachten Sie jedoch, dass Visual Studio 2008 zur Laufzeit eine Debug-Assertion (checked iterators) auslöst, wenn Sie dies tun.