Стирание последнего элемента с помощью reverse_iterator

Недавно я нашел следующее в коде, который я поддерживаю:

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. Дело в том, что похоже, что он должен работать должным образом, но это не так (некоторые повреждения памяти происходят из-за неправильных итераторов), и мне интересно, почему? Есть ли ограничение или правило, чтобы не делать этого?

Благодарю.

Постскриптум Чтобы предотвратить какие-либо улучшения решения, я уже переписал его, чтобы оно работало. Вопрос в том, почему код выше не работает должным образом?

0

Решение

Все итераторы после вызова erase признаны недействительными Тем не мение, erase возвращает итератор, который вы можете использовать.

1

Другие решения

rit является аннулированных посредством erase вызов.

1

Вам нужно сохранить возвращаемое значение 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.
}
1
По вопросам рекламы [email protected]