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