Недавно я нашел следующее в коде, который я поддерживаю:
for (reverse_iterator rit = base_container::rbegin(); rit != base_container::rend() && 0 < N; N--)
{
another_container->push_back(*rit);
base_container::erase((++rit).base());
}
Он пытается удалить последний элемент из контейнера (в данном случае std :: list) в цикле, используя reverse_iterator. Дело в том, что похоже, что он должен работать должным образом, но это не так (некоторые повреждения памяти происходят из-за неправильных итераторов), и мне интересно, почему? Есть ли ограничение или правило, чтобы не делать этого?
Благодарю.
Постскриптум Чтобы предотвратить какие-либо улучшения решения, я уже переписал его, чтобы оно работало. Вопрос в том, почему код выше не работает должным образом?
Все итераторы после вызова erase
признаны недействительными Тем не мение, erase
возвращает итератор, который вы можете использовать.
rit
является аннулированных посредством erase
вызов.
Вам нужно сохранить возвращаемое значение erase()
и преобразовать его обратно в reverse_iterator
чтобы избежать аннулирования итератора.
for (reverse_iterator rit = base_container::rbegin(); rit != base_container::rend() && 0 < N; N--)
{
another_container->push_back(*rit);
auto it =base_container::erase((++rit).base()); //erase will return an iteraotor
rit(it);//converting iterator to reverse_iterator.
}