Qué sucede si incrementa un iterador que es igual al iterador final de un contenedor STL

¿Qué sucede si incremento un iterador en 2 cuando apunta al último elemento de un vector? Enesta pregunta preguntando cómo ajustar el iterador a un contenedor STL por 2 elementos, se ofrecen dos enfoques diferentes:

use una forma de operador aritmético - + = 2 o ++ dos veceso use std :: advance ()

He probado ambos con VC ++ 7 para el caso de borde cuando el iterador apunta al último elemento del contenedor STL o más allá:

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

He visto muchas veces un aviso para comparar con vector :: end () al atravesar el vector y otros contenedores:

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

Obviamente, si el iterador avanza más allá del último elemento dentro del bucle, la comparación en la sentencia for-loop se evaluará como falsa y el bucle continuará felizmente en un comportamiento indefinido.

¿Entiendo bien que si alguna vez uso el método de avance () o cualquier tipo de operación de incremento en un iterador y hago que pase el extremo del contenedor, no podré detectar esta situación? Si es así, ¿cuál es la mejor práctica: no usar tales avances?

Respuestas a la pregunta(8)

Su respuesta a la pregunta