2015-07-20 3 views
0

Недавно я нашел следующее в коде я поддерживать:Удаление последнего элемента с 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 :: список в данном случае) в цикл с использованием reverse_iterator. Дело в том, что похоже, что он должен работать должным образом, но это не так (некоторые повреждения памяти происходят из-за недействительных итераторов), и мне интересно, почему? Существуют ли какие-либо ограничения или правила, чтобы не делать этого?

Спасибо.

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

+0

Не ответ на ваш вопрос, но почему так сложно? Не можете ли вы сначала скопировать весь контейнер, а затем очистить его? Кроме того, что такое base_container? – MikeMB

+0

std :: list как я написал выше – Rom098

+0

Вы наследуете от контейнера как 'base_container ::' предлагает? :-( – Jarod42

ответ

1

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

+0

Не все итераторы, но, конечно, итератор, указывающий на стертый элемент. – rici

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. 
} 
Смежные вопросы