Здравствуйте.
Возник вопрос — как удалять обьекты в std::list
код
list<int> l;
//init l;
for (list<int>::iterator it = l.begin(); it != l.end(); ++it)
{
if (*it == 0)
{
l.erase(it);
}
}
естественно не работает, т.к после erase(it) it становится невалидным.
Расскажите пожалуйста, кто как решает эту проблему
Спасибо
Здравствуйте, Аноним, Вы писали:
А>Возник вопрос — как удалять обьекты в std::list
В сад? Не, что-то добрые мы сегодня...
У нас в Н-ске горилка с перцем появилась после кризиса
// работает для std::list, std::set, std::map
list<int>::iterator it = l.begin();
while (it != l.end())
{
if (*it == 0)
l.erase(it++);
else
++it;
}
// или лучше
l.remove_if( std::bind1st(std::equal_to<int>(), 0) );
Здравствуйте, <Аноним>, Вы писали:
А>Возник вопрос — как удалять обьекты в std::list
>Расскажите пожалуйста, кто как решает эту проблему
1. list::erase возвращает валидный итератор (см. 23.2.2.3 )
2. remove_if
--
Sergey Chadov
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Здравствуйте, Аноним, Вы писали:
А>Здравствуйте.
А>Возник вопрос — как удалять обьекты в std::list
А>код
А>list<int> l;
А>//init l;
А>for (list<int>::iterator it = l.begin(); it != l.end(); ++it)
А>{
А> if (*it == 0)
А> {
А> l.erase(it);
А> }
А>}
А>естественно не работает, т.к после erase(it) it становится невалидным.
А>Расскажите пожалуйста, кто как решает эту проблему
А>Спасибо
l.remove(value_to_erase);
Нужно отметить, что это тоже приемлемый вариант
:
l.remove_if( std::bind1st(std::equal_to<int>(), 0) );
"По воробьям из пушки"
На всякий случай всем читать тов. Мейерса