¿Qué sucede si incrementó un iterador entre 2 cuando apunta al último elemento de un vector? En this question preguntando cómo ajustar el iterador a un contenedor STL por 2 elementos se ofrecen dos enfoques diferentes:¿Qué ocurre si incrementa un iterador que es igual al iterador final de un contenedor de STL
- o bien utilizar una forma de operador aritmético - + ++ = 2 ó dos veces
- o utilizar std :: avance()
he probado ambos con VC++ 7 para el caso de borde cuando los puntos de iterador en el último elemento del contenedor STL o más allá:
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
he visto veces al día Puede un consejo para comparar contra el vector :: end() cuando se atraviesa el vector y otros recipientes:
for(vector<int>::iterator it = vec.begin(); it != vec.end(); it++) {
//manipulate the element through the iterator here
}
Obviamente, si el iterador está avanzado más allá del último elemento en el interior del bucle de la comparación en el La sentencia for-loop evaluará a false y el bucle continuará felizmente en un comportamiento indefinido.
¿Lo entiendo bien si alguna vez uso el avance() o cualquier tipo de operación de incremento en un iterador y hago que apunte más allá del final del contenedor no podré detectar esta situación? Si es así, ¿cuál es la mejor práctica, no usar tales avances?
Cómo comprobar si está en el rango después de la operación aritmética? – Narek
Esto no es para nada convincente. ¿Dónde está la cita del estándar? No puedo respaldar la afirmación de Josuttis en este momento. :( –