Was ist, wenn ich einen Iterator um 2 inkrementiere, wenn er auf das letzte Element eines Vektors zeigt? In dieser Frage , wie der Iterator durch zwei Elemente an einen STL-Container angepasst werden kann, werden zwei verschiedene Ansätze angeboten:
- Verwenden Sie entweder zweimal eine Form des arithmetischen Operators - + = 2 oder ++
- oder benutze std :: advanced ()
Ich habe beide mit VC ++ 7 auf den Randfall getestet, wenn der Iterator auf das letzte Element des STL-Containers oder darüber hinaus zeigt:
vector<int> vec;
vec.push_back( 1 );
vec.push_back( 2 );
vector<int>::iterator it = vec.begin();
advance( it, 2 );
bool isAtEnd = it == vec.end(); // true
it++; // or advance( it, 1 ); - doesn't matter
isAtEnd = it == vec.end(); //false
it = vec.begin();
advance( it, 3 );
isAtEnd = it == vec.end(); // false
Ich habe vielleicht mal einen Rat gesehen, beim Überqueren des Vektors und anderer Container mit vector :: end () zu vergleichen:
for( vector<int>::iterator it = vec.begin(); it != vec.end(); it++ ) {
//manipulate the element through the iterator here
}
Wenn der Iterator über das letzte Element in der Schleife hinaus vorgerückt ist, wird der Vergleich in der for-Schleifenanweisung offensichtlich als falsch ausgewertet, und die Schleife wird glücklich in ein undefiniertes Verhalten übergehen.
Verstehe ich es richtig, dass ich diese Situation nicht erkennen kann, wenn ich jemals progress () oder irgendeine Art von Inkrementoperation für einen Iterator verwende und ihn über das Ende des Containers hinaus zeige? Wenn ja, was ist die beste Vorgehensweise, um solche Fortschritte nicht zu nutzen?