O que acontece se você incrementar um iterador igual ao iterador final de um contêiner STL

E se eu incrementar um iterador por 2 quando ele apontar para o último elemento de um vetor? Emessa questão perguntando como ajustar o iterador para um contêiner STL por 2 elementos, duas abordagens diferentes são oferecidas:

use uma forma de operador aritmético - + = 2 ou ++ duas vezesou use std :: advance ()

Eu testei ambos com VC ++ 7 para o caso de borda quando o iterador aponta para o último elemento do contêiner STL ou além:

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

Eu vi vezes vezes um conselho para comparar contra vector :: end () ao atravessar o vetor e outros recipientes:

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

Obviamente, se o iterador for avançado após o último elemento dentro do loop, a comparação na instrução for-loop será avaliada como false e o loop continuará felizmente no comportamento indefinido.

Eu entendi direito que, se eu usar o avanço () ou qualquer tipo de operação de incremento em um iterador e fazê-lo apontar para além do final do contêiner, não serei capaz de detectar essa situação? Se sim, qual é a melhor prática - não usar tais avanços?

questionAnswers(8)

yourAnswerToTheQuestion