Что произойдет, если вы увеличите итератор, равный конечному итератору контейнера STL
Что если я увеличу итератор на 2, когда он укажет на последний элемент вектора? Вэтот вопрос на вопрос, как настроить итератор для контейнера STL с помощью 2 элементов, предлагаются два различных подхода:
either use a form of arithmetic operator - +=2 or ++ twice or use std::advance()Я протестировал оба из них с VC ++ 7 для граничного случая, когда итератор указывает на последний элемент контейнера STL или дальше:
<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>
Я иногда видел совет, который можно сравнить с vector :: end () при обходе вектора и других контейнеров:
<code>for( vector<int>::iterator it = vec.begin(); it != vec.end(); it++ ) { //manipulate the element through the iterator here } </code>
Очевидно, что если итератор перемещается за последний элемент внутри цикла, сравнение в операторе for-loop будет иметь значение false, и цикл с радостью продолжит неопределенное поведение.
Правильно ли я понимаю, что если я когда-либо использую advance () или какую-либо инкрементную операцию на итераторе и заставлю ее указывать за конец контейнера, я не смогу обнаружить эту ситуацию? Если да, то какова лучшая практика - не использовать такие достижения?