Я просматриваю std :: list, используя обратные итераторы и стираю некоторые элементы из списка, используя их передовые итераторы, которые были получены при их вставке. Пример программы показан ниже. Я читал, что удаление элементов из списка не делает недействительными другие итераторы, кроме тех, которые ссылаются на удаленный элемент. Но об обратном-обращении нет и моя программа рушится. Может кто-нибудь, пожалуйста, сообщите, является ли использование неправильным?std :: list reverse iterating & erasing вызывает сбой
Что делает программа - это добавить элемент в список, сохранить его итератор, отменить итерацию списка и удалить единственный элемент в списке, используя его сохраненный итератор.
Выходной сигнал вставляется под образцом кода.
#include <list>
#include <iostream>
using namespace std;
struct node
{
int data;
list<node*>::iterator iter;
} a;
int main()
{
list<node*> l;
a.data = 1;
l.push_front(&a);
a.iter = l.begin();
list<node*>::reverse_iterator ri = l.rbegin();
while (ri != l.rend())
{
cout << (*ri)->data << endl;
list<node*>::reverse_iterator rj = ri;
++ri;
if (ri == l.rend())
cout << "before erase: reached end" << endl;
l.erase((*rj)->iter);
if (ri == l.rend())
cout << "after erase : reached end" << endl;
else
cout << "after erase : Not reached end" << endl;
}
}
ВЫВОД
1
before erase: reached end
after erase : Not reached end
610568524
before erase : reached end
Segmentation fault
Что именно вы хотите сделать (не этот конкретный случай с 1 элементом, но вообще)? – SingerOfTheFall
Я добавляю объекты, содержащие временную метку создания, в список для некоторой обработки. После завершения обработки они удаляются и удаляются немедленно. Существует тайм-аут для обработки, и функция постоянно проверяет затушенные объекты путем обратного итерации через этот список по соображениям эффективности. – vrk001
Если вы уверены в нормальных итераторах и не уверены в обратных, вы можете также использовать обычный, начинать с 'vec.end()', обрабатывать в цикле, например 'while (iterator! = Vec.begin)', и в самом цикле, используйте 'iterator -' вместо 'iterator ++'. ИМО легче понять, но это зависит от вас. – SingerOfTheFall