erase в std:list
От: RSNT  
Дата: 03.05.06 15:11
Оценка:
Приветствую,
возникла проблема с удаление елемента списка.


 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 все удалить.
Re: erase в std:list
От: Bell Россия  
Дата: 03.05.06 15:16
Оценка: 1 (1)
Здравствуйте, 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;
}


Или же использовать метод списка remove_if.
Любите книгу — источник знаний (с) М.Горький
Re[2]: erase в std:list
От: denisku Россия  
Дата: 04.05.06 10:48
Оценка:
Здравствуйте, Bell, Вы писали:

B>
B>list <int> c1;
B> list <int>::iterator c1_Iter = c1.begin(), e = c1.end();
B>while(c1_Iter != e)
B>{
B>   if(/*нужно удалить*/)
B>      c1_Iter = c1.erase(c1_Iter);
B>   else
B>      ++c1_Iter;
B>}
B>

а вызов erase() не сделает e невалидным? имхо, надо бы сделать
while(c1_Iter != c1.end())
Извините за потраченный траффик..
Re[3]: erase в std:list
От: FreshMeat Россия http://www.rsdn.org
Дата: 04.05.06 10:57
Оценка:
Здравствуйте, denisku, Вы писали:

D>а вызов erase() не сделает e невалидным?

Нет. Добавление/удаление элементов списка не влияет на валидность итераторов (видимо, с вектором спутал)
http://gzip.rsdn.ru/article/cpp/stl.xml#EMVBG
Автор(ы): Александр Степанов, Менг Ли

Список (List)
...
erase делает недействительными только итераторы и ссылки для стёртых элементов. Стирание единственного элемента — операция постоянного времени с единственным вызовом деструктора T. Стирание диапазона в списке занимает линейное время от размера диапазона, а число вызовов деструктора типа T точно равно размеру диапазона.

Хорошо там, где мы есть! :)
Re[4]: erase в std:list
От: saddva  
Дата: 04.05.06 12:54
Оценка:
Здравствуйте, FreshMeat, Вы писали:

FM>Здравствуйте, denisku, Вы писали:


D>>а вызов erase() не сделает e невалидным?

FM>Нет. Добавление/удаление элементов списка не влияет на валидность итераторов (видимо, с вектором спутал)
FM>http://gzip.rsdn.ru/article/cpp/stl.xml#EMVBG
Автор(ы): Александр Степанов, Менг Ли

FM>

FM>Список (List)
FM>...
FM>erase делает недействительными только итераторы и ссылки для стёртых элементов. Стирание единственного элемента — операция постоянного времени с единственным вызовом деструктора T. Стирание диапазона в списке занимает линейное время от размера диапазона, а число вызовов деструктора типа T точно равно размеру диапазона.


А если удаляется последний элемент списка? Даже в этом случае e останется валидным?
Re[5]: erase в std:list
От: FreshMeat Россия http://www.rsdn.org
Дата: 04.05.06 13:06
Оценка:
Здравствуйте, saddva, Вы писали:

S>А если удаляется последний элемент списка? Даже в этом случае e останется валидным?

Да. end() у списка сделан вообще достаточно хитро. Сырцы реализаций STL не копал, но есть сильное подозрение (следующее из логики работы класса), что end() фиксируется в момент создания списка и не изменяется все время жизни листа.
Хорошо там, где мы есть! :)
Re: erase в std:list
От: rg45 СССР  
Дата: 05.05.06 14:00
Оценка:
"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
--
Не можешь достичь желаемого — пожелай достигнутого.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.