STL <list> Как удалять элементы?

0000

Хоцца удалять элементы, которые удовлетворяют некоторому условию.
Такой код не прокатывает (судя по всему после удаления элемента надо заново инициализировать итератор)

#include <list>
...
list<int> l;
l.push_back (1);
l.push_back (2);
l.push_back (3);
l.push_back (4);
l.push_back (3);


for (i = l.begin ; i != l.end; ++i)
{
if *i) == 3)
l.erase(i);
}

Единственное, что пришло в голову, это организовать цикл, где если элемент найден, то удалить его и заново проинициализировать итератор. Но че то мне кажется можно проще, без нескольких пробегов списка.
Вопрос - как?

ppplva

Портится только итератор на удаленный элемент. Сдвигай итератор до удаления.

psm-home

list::remove_if

0000

Ты знал, ты знал Пасиб

evgen5555

MSVC-шный erase возвращает инкремент итератора.

0000

Хе-хе, у меня Dev C++ и вот такое работает

#include <list>
...
list<int> l;
l.push_back (1);
l.push_back (2);
l.push_back (3);
l.push_back (4);
l.push_back (3);


for (i = l.begin ; i != l.end; ++i)
{
if *i) == 3)
i = l.erase(i);
}

И тебе пасиб

evgen5555

Следует на будущее учесть, что это нестандартное поведение

Werdna

MSVC-шный erase

Не надо использовать платформозависимые вещи. Стыдно должно быть за упоминание M$ в треде по STL.

okunek


The iterator returned from a.erase(q) points to the element immediately following q prior to the element being erased. If no such element exists, a.end is returned.

a - sequence

list<int> l;
list<int>::iterator it1, it2;

l.push_back(1);
l.push_back(2);
l.push_back(3);
l.push_back(4);
l.push_back(5);

it1 = ++++l.begin;
it2 = l.erase(it1);

it2 -> 4
it1 -> говно (по понятным причинам)
где хуйня, че-то не врублюсь?

evgen5555

силиконовский стл смотрел?

evgen5555

А, сорри, объебался
Я перепутал ассоциативные контейнеры с последовательностями, вопрос снят с повестки дня.

okunek

Знаю, что в мс-овском stl-e у std::exception есть еще конструктор с char const *, чем в стандарте и не пахнет.
Просто интересно, что еще такого? (сравнивая stl 2005-й студии, конешно, старое в пизду)

Werdna

в мс-овском stl-e у std::exception есть еще конструктор с char const *,

Ну и нахуя это надо? есть же std::logic_error

okunek

я не ебу, нахуя надо
в майкрософте прогерам моча в голову ударила
мне интересно, что еще, раз уж ты написал, что должно быть стыдно?

Werdna

Ну M$ — это просто стыдно. Они же не могут следовать общим стандартам, им надо изъёбов понаделать.
hash_map'а вроде, например, нет.

okunek

все понятно...

FRider

не оно ?

smit1

http://www.sgi.com/tech/stl/Sequence.html
Erase a.erase(p) p is a dereferenceable iterator in a. Destroys the element pointed to by p and removes it from a. [3] a.size is decremented by 1. The relative order of the other elements in the sequence is unchanged. The return value is an iterator to the element immediately following the one that was erased.
>где хуйня, че-то не врублюсь?
А что там не так?

deniska



Просто интересно, что еще такого? (сравнивая stl 2005-й студии, конешно, старое в пизду)
Вроде еще prev_permutation для контейнера с равными элементами неадекватно работает (по крайней мере в 7 студии все еще есть этот баг). При этом next_permutation работает правильно. Может ужо подправили (дело было в том, что перепутаны (a < b) и !(b < a

FRider

ага, точно
2Пеонизд: кури мсдн все таки.
ЗЫ На С++ не пишу

Werdna

2Пеонизд: кури мсдн все таки.

Ты последний, у кого я спрошу совета. Особенно после такого:
ЗЫ На С++ не пишу

0000

Тут конечно все папки немерянные, тока можно ли уточнить - то что l.erase возвращает - это стандартно?
Стоит ли изучать всякие STLport, boost и другие.
А чем хреново STL - что то некоторые пишут, что лучше отказаться от шаблонов...

evgen5555

В последовательных списках erase ведет себя зачотно )

okunek

цитата из стандарта несколькими постами выше
и что тебе мешает самому туда посмотреть?

0000

Хреновое знание английского (в общих чертах я уловил, что он возвращает; но в правильности совего перевода не до конца был уверен).
Вообщем с этим понятно.
А что с либами?

okunek

стоит использовать boost
это не связано конкретно с твоим вопросом, но иногда буст очень сильно упрощает жизнь

0000

У него вроде как минус - большой размер (правда вроде его частично можно использовать) + проблемы со скоростью (то же про STL)?
P.S. Сильно не пинайте, я начинающий прогер на С++

okunek

это все предрассудки
ну все зависит от того, какие бустовские библиотеки ты используешь
Оставить комментарий
Имя или ник:
Комментарий: