Приветствую,
возникла проблема с удаление елемента списка.
list <int> c1;
list <int>::iterator c1_Iter;
for ( c1_Iter = c1.begin( ); c1_Iter != c1.end( ); c1_Iter++ )
{
//что-то делаем с c1_Iter и поняли что нужно удалить этот элемент, но чтобы цикл продолжился
}
c1.erase(c1_Iter); всё рушит и я почти понял почему
Подскажите как правильно удалить, пока приходит на ум только создать второй список на удаление и после цикла for все удалить.
Здравствуйте, RSNT, Вы писали:
RSN>Приветствую, RSN>возникла проблема с удаление елемента списка.
RSN>
RSN> list <int> c1;
RSN> list <int>::iterator c1_Iter;
RSN>for ( c1_Iter = c1.begin( ); c1_Iter != c1.end( ); c1_Iter++ )
RSN>{
RSN>//что-то делаем с c1_Iter и поняли что нужно удалить этот элемент, но чтобы цикл продолжился
RSN>}
RSN>
RSN>c1.erase(c1_Iter); всё рушит и я почти понял почему
RSN>Подскажите как правильно удалить, пока приходит на ум только создать второй список на удаление и после цикла for все удалить.
list <int> c1;
list <int>::iterator c1_Iter = c1.begin(), e = c1.end();
while(c1_Iter != e)
{
if(/*нужно удалить*/)
c1_Iter = c1.erase(c1_Iter);
else
++c1_Iter;
}
Здравствуйте, denisku, Вы писали:
D>а вызов erase() не сделает e невалидным?
Нет. Добавление/удаление элементов списка не влияет на валидность итераторов (видимо, с вектором спутал) http://gzip.rsdn.ru/article/cpp/stl.xml#EMVBG
Список (List)
...
erase делает недействительными только итераторы и ссылки для стёртых элементов. Стирание единственного элемента — операция постоянного времени с единственным вызовом деструктора T. Стирание диапазона в списке занимает линейное время от размера диапазона, а число вызовов деструктора типа T точно равно размеру диапазона.
Здравствуйте, FreshMeat, Вы писали:
FM>Здравствуйте, denisku, Вы писали:
D>>а вызов erase() не сделает e невалидным? FM>Нет. Добавление/удаление элементов списка не влияет на валидность итераторов (видимо, с вектором спутал) FM>http://gzip.rsdn.ru/article/cpp/stl.xml#EMVBG
FM>Список (List)
FM>...
FM>erase делает недействительными только итераторы и ссылки для стёртых элементов. Стирание единственного элемента — операция постоянного времени с единственным вызовом деструктора T. Стирание диапазона в списке занимает линейное время от размера диапазона, а число вызовов деструктора типа T точно равно размеру диапазона.
А если удаляется последний элемент списка? Даже в этом случае e останется валидным?
Здравствуйте, saddva, Вы писали:
S>А если удаляется последний элемент списка? Даже в этом случае e останется валидным?
Да. end() у списка сделан вообще достаточно хитро. Сырцы реализаций STL не копал, но есть сильное подозрение (следующее из логики работы класса), что end() фиксируется в момент создания списка и не изменяется все время жизни листа.
"RSNT" <23505@users.rsdn.ru> wrote in message news:1878998@news.rsdn.ru... > Приветствую, > возникла проблема с удаление елемента списка. > > >
> list <int> c1;
> list <int>::iterator c1_Iter;
>
> for ( c1_Iter = c1.begin( ); c1_Iter != c1.end( ); c1_Iter++ )
> {
> //что-то делаем с c1_Iter и поняли что нужно удалить этот элемент, но чтобы цикл продолжился
> }
>
>
> > c1.erase(c1_Iter); всё рушит и я почти понял почему > > Подскажите как правильно удалить, пока приходит на ум только создать второй список на удаление и после цикла for все удалить.
При помощи вспомогательного итератора проблема решается достаточно просто:
list <int> c1;
list <int>::iterator c1_Iter, c1_Iter2;
for ( c1_Iter = c1_Iter2 = c1.begin( ); c1_Iter != c1.end( ); c1_Iter = c1_Iter2)
{
++c1_Iter2;
//что-то делаем с c1_Iter...
c1.erase(c1_Iter);
}
Posted via RSDN NNTP Server 2.0
--
Не можешь достичь желаемого — пожелай достигнутого.