Qu'advient-il si vous incrémenter un itérateur qui est égal à la fin de l'itérateur d'un conteneur STL

Ce que si je incrémenter un itérateur par 2 quand il pointe sur le dernier élément d'un vecteur? Dans cette question demandant comment régler l'itérateur à un conteneur STL par 2 éléments, deux approches différentes sont proposées:

  • soit recourir à un opérateur arithmétique - +=2 ++ ou deux fois
  • ou utiliser std::advance()

J'ai testé les deux d'entre eux avec VC++ 7 pour le cas limite lorsque l'itérateur les points sur le dernier élément du conteneur STL ou au-delà:

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

J'ai vu des fois un conseiller à comparer vector::end() lors de la traversée du vecteur et d'autres contenants:

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

Évidemment, si l'itérateur est avancé après le dernier élément à l'intérieur de la boucle de la comparaison dans la boucle for la déclaration de la valeur false et la boucle sera heureux de continuer dans un comportement indéterminé.

Puis-je obtenir ce droit que si j'utilise jamais l'avance() ou toute sorte d'opération d'incrémentation sur un itérateur et de faire le point passé le conteneur de la fin, je vais être incapable de détecter cette situation? Si oui, quelle est la meilleure pratique - n'utiliser de telles avancées?

InformationsquelleAutor sharptooth | 2009-06-29