Re[2]: Map и удаление элементов.
От: Bell Россия  
Дата: 29.10.04 06:52
Оценка:
Здравствуйте, Dj.ValDen, Вы писали:
DV>А так ?


DV>
DV>    std::map <int,СЛОЖНАЯ_СТРУКТУРА>::iterator e;
DV>    e = std::remove(a.begin(),a.end(),some_map_element); ///если на совпадение
DV>    /// e = std::remove_if(a.begin(),a.end(),predicate(...));   ///если по условию
DV>        a.erase(e,a.end());
DV>


DV>


Алгоритмы remove/remove_if не работают с ассоциативными контейнерами.
Это только что повторили здесь
Автор: Carc
Дата: 28.10.04
Любите книгу — источник знаний (с) М.Горький
Re[2]: Map и удаление элементов.
От: Dj.ValDen Украина http://ua.linkedin.com/in/dvalchuk
Дата: 29.10.04 07:21
Оценка:
DV>
DV>    std::map <int,СЛОЖНАЯ_СТРУКТУРА>::iterator e;
DV>    e = std::remove(a.begin(),a.end(),some_map_element); ///если на совпадение
DV>    /// e = std::remove_if(a.begin(),a.end(),predicate(...));   ///если по условию
DV>        a.erase(e,a.end());
DV>


oops
sorry
я не прав...
С уважением Denys Valchuk

IMHO чем больше мнений тем оптимальней выбор варианта... :)
Re[5]: map и удаление элементов.
От: Кодт Россия  
Дата: 29.10.04 07:46
Оценка:
Здравствуйте, Павел Кузнецов, Вы писали:

>> ПК>У стандартного std::map<>::erase возвращаемое значение — void.


>> Вроде поднимался вопрос, чтобы переделать чтобы было как у всех контейнеров. И вроде как идею не зарубили совсем.


ПК>Насколько я помню последние обсуждения, то как раз наоборот: было решено этого не делать, т.к. для std::map/std::set инкремент итератора в некоторых случаях может оказываться достаточно дорогой операцией.


А это не спасёт: добыча итератора на следующий за удалённым элемент в дереве — такая же дорогостоящая, как и простой инкремент. Ну может быть, чуть-чуть дешевле, если после перебалансировки расстояние между элементами в дереве сократилось.
Ну а если говорить точно, то время инкремента — O(log N).
Перекуём баги на фичи!
Re[6]: map и удаление элементов.
От: ssm Россия  
Дата: 29.10.04 07:57
Оценка: +1
Здравствуйте, Кодт, Вы писали:


К>А это не спасёт: добыча итератора на следующий за удалённым элемент в дереве — такая же дорогостоящая, как и простой инкремент. Ну может быть, чуть-чуть дешевле, если после перебалансировки расстояние между элементами в дереве сократилось.

К>Ну а если говорить точно, то время инкремента — O(log N).

имеется в виду, что при конструкции, не требующей нового итератора, его не вычислять:
m.erase(it);//ну нужен новый итератор

если же нужен новый итератор, то будь добр позаботиться об этом сам
Re: map и удаление элементов.
От: Аноним  
Дата: 03.11.04 09:43
Оценка:
Здравствуйте, Павел Кузнецов, Вы писали:

ПК>for (MyMap::iterator i = m.begin(), e = m.end(); i != e; /* здесь пусто */ )

ПК>{
ПК> if ( . . . )
ПК> m.erase(i++);
ПК> else
ПК> ++i;
ПК>}

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


iterator i=begin();

while( i != end() ) 
{
     if(i->second->must_die()) {
          delete i->second; // В деструкторе могут удаляться еще несколько объектов map'a ( вызывается erase( key ) )
          P::erase( i++ );
     } else {
          ++i;
     }
}
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.