Was passiert, wenn Sie einen Iterator erhöhen, der dem End-Iterator eines AWL-Containers entspricht?

Was passiert, wenn ich einen Iterator um 2 erhöhe, wenn er auf das letzte Element eines Vektors zeigt? Imdiese Frage Bei der Frage, wie der Iterator durch zwei Elemente an einen AWL-Container angepasst werden kann, werden zwei verschiedene Ansätze angeboten:

Verwenden Sie entweder eine Form des arithmetischen Operators - + = 2 oder ++ zweimaloder benutze std :: advance ()

Ich habe beide mit VC ++ 7 auf den Edge-Fall getestet, bei dem der Iterator auf das letzte Element des STL-Containers oder darüber hinaus zeigt:

<code>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
</code>

Ich habe vielleicht mal einen Ratschlag zum Vergleich gegen vector :: end () beim Durchlaufen des Vektors und anderer Container gesehen:

<code>for( vector<int>::iterator it = vec.begin(); it != vec.end(); it++ ) {
    //manipulate the element through the iterator here
}
</code>

Wenn der Iterator über das letzte Element in der Schleife hinaus vorgerückt ist, wird der Vergleich in der for-loop-Anweisung offensichtlich als falsch ausgewertet und die Schleife wird problemlos in ein undefiniertes Verhalten überführt.

Verstehe ich, dass ich diese Situation nicht erkennen kann, wenn ich jemals advance () oder eine Inkrementierungsoperation für einen Iterator verwende und ihn über das Ende des Containers hinaus zeigen lasse? Wenn ja, was ist die beste Vorgehensweise - solche Fortschritte nicht zu nutzen?

Antworten auf die Frage(8)

Ihre Antwort auf die Frage