Здравствуйте, 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
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
я не прав...
Здравствуйте, Кодт, Вы писали:
К>А это не спасёт: добыча итератора на следующий за удалённым элемент в дереве — такая же дорогостоящая, как и простой инкремент. Ну может быть, чуть-чуть дешевле, если после перебалансировки расстояние между элементами в дереве сократилось.
К>Ну а если говорить точно, то время инкремента — O(log N).
имеется в виду, что при конструкции, не требующей нового итератора, его не вычислять:
m.erase(it);//ну нужен новый итератор
если же нужен новый итератор, то будь добр позаботиться об этом сам
Здравствуйте, Павел Кузнецов, Вы писали:
ПК>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;
}
}