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?