Re: удаление некоторых элементов из map - как это работает?
От: Александр Россия  
Дата: 06.10.04 06:55
Оценка:
Здравствуйте, 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>Т.е. иначе, как в два прохода это не сделать...я правильно понимаю
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.