Co się stanie, jeśli zwiększysz iterator, który jest równy iteratorowi końcowemu kontenera STL

Co zrobić, jeśli zwiększę iterator o 2, gdy wskazuje na ostatni element wektora? Wto pytanie pytając, jak dostosować iterator do kontenera STL o 2 elementy, oferowane są dwa różne podejścia:

albo użyj postaci operatora arytmetycznego - + = 2 lub ++ dwa razylub użyj std :: advance ()

Przetestowałem oba z VC ++ 7 dla przypadku krawędzi, gdy iterator wskazuje na ostatni element kontenera STL lub dalej:

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

Widziałem, że może czasami radzę porównać z vector :: end () podczas przechodzenia przez wektor i inne kontenery:

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

Oczywiście, jeśli iterator zostanie przesunięty poza ostatni element w pętli, porównanie w instrukcji for-loop zmieni się na false, a pętla z radością przejdzie do niezdefiniowanego zachowania.

Czy mam rację, że jeśli kiedykolwiek użyję zaliczki () lub jakiejkolwiek operacji inkrementacji na iteratorze i wskażę koniec kontenera, nie będę w stanie wykryć tej sytuacji? Jeśli tak, jaka jest najlepsza praktyka - nie używać takich postępów?

questionAnswers(8)

yourAnswerToTheQuestion