Здравствуйте, maslukov, Вы писали:
M> Здравствуйте!
M>В форуме не раз поднимался вопрос — как удалить из std::map некоторые эелементы удовлетворяющие некотрому условию.
M>_Внимательно изучив старые ветки_, я все таки не до конца проявнил ситуацию. В связи с этим хочу задать пару вопросов
M>1. при удалении из Map ( а как известно Map это сортированное дерево ) Map перестраиваеться и простой проход по циклу может никогда не закончиться
M>
M>// Инициализацяи и лишние опрелделения пропущены
M>// этот код неверен
M>it = m_map.begin();
M>while(it != m_map.end)
M>{
M> if(условие)// проверка условия
M> {
M> //- удаление по ключю - MAP перестраиваеться следовательно it может не достигнуть m_map.end()
M> map.erase(it->first)
M> }
M> it++;
M>}
M>
так делать НИЗЯ!
... после map.erase(it->first) итератор может указывать черт знает куда!
а от чего зависит условие?? почему бы просто не удалять по ключу?
M>2. Можно конечно использовать алгоритм erase и предикат удаления — но я все равно не понимаю как ЭТО работает.
M>Ведь очевидно , для того чтобы корректно удалить из map несколько элементов — необходимо сначала собрать все ключи элементов подлежащих удалению в отдельный список, а затем удалить их.
M>
M>// Инициализацяи и лишние опрелделения пропущены
M>it = m_map.begin();
M>while(it != m_map.end)
M>{
M> if(условие)
M> list.push_back(it->first) // запоминаем ключи элементов подлежащих удалению
M> it++;
M>}
M>// теперь удаляем
M>it = list.begin();
M>while(it!=list.end() )
M>{
M> m_map.erase(*it);
M>}
M>
M>Т.е. иначе, как в два прохода это не сделать...я правильно понимаю