STL: remove_if() на контейнере map используя VC++ 7.1
От: OriginalZealot Россия  
Дата: 03.08.06 12:27
Оценка:
Я хочу удалить из карты элементы при помощи remove_if() и своего предиката.

Контейнер map, как известно, содержит pair, а remove_if() при своей работе использует использует operator =(), который для pair не определен.

Что же мне делать?
Re: STL: remove_if() на контейнере map используя VC++ 7.1
От: pavel_turbin  
Дата: 03.08.06 12:30
Оценка:
Здравствуйте, OriginalZealot, Вы писали:

OZ>Я хочу удалить из карты элементы при помощи remove_if() и своего предиката.


OZ>Контейнер map, как известно, содержит pair, а remove_if() при своей работе использует использует operator =(), который для pair не определен.


OZ>Что же мне делать?


на сколько я помню remove_if() для map не работает. Используем for_each.
Re: STL: remove_if() на контейнере map используя VC++ 7.1
От: Bell Россия  
Дата: 03.08.06 12:35
Оценка: 1 (1)
Здравствуйте, OriginalZealot, Вы писали:

OZ>Я хочу удалить из карты элементы при помощи remove_if() и своего предиката.


OZ>Контейнер map, как известно, содержит pair, а remove_if() при своей работе использует использует operator =(), который для pair не определен.

Он определен для std::pair, просто дело в том, что член first этой пары — константа:
map<Key, Value>::value_type == pair<const Key, Value>


OZ>Что же мне делать?

Я думаю, что конец света не наступит, если такое удаление сделать руками:
map<>::iterator it = m.begin();
while(it != m.end())
{
   if(pred(*it))
      m.erase(it++);
   else
      ++it;
}
Любите книгу — источник знаний (с) М.Горький
Re[2]: STL: remove_if() на контейнере map используя VC++ 7.1
От: Какая разница Украина  
Дата: 03.08.06 12:47
Оценка:
Здравствуйте, Bell, Вы писали:

B>Здравствуйте, OriginalZealot, Вы писали:


OZ>>Я хочу удалить из карты элементы при помощи remove_if() и своего предиката.


OZ>>Контейнер map, как известно, содержит pair, а remove_if() при своей работе использует использует operator =(), который для pair не определен.

B>Он определен для std::pair, просто дело в том, что член first этой пары — константа:
B>
B>map<Key, Value>::value_type == pair<const Key, Value>
B>


OZ>>Что же мне делать?

B>Я думаю, что конец света не наступит, если такое удаление сделать руками:
B>
B>map<>::iterator it = m.begin();
B>while(it != m.end())
B>{
B>   if(pred(*it))
B>      m.erase(it++);
B>   else
B>      ++it;
B>}
B>



наверное так безопасней будет

    it = m.erase(it);
!0xDEAD
Re[3]: STL: remove_if() на контейнере map используя VC++ 7.1
От: Bell Россия  
Дата: 03.08.06 12:58
Оценка: 5 (2)
Здравствуйте, Какая разница, Вы писали:

КР> наверное так безопасней будет


КР>
КР>    it = m.erase(it);
КР>


Во-первых, этот вариант ничуть не безопасней (в смысле мой вариант абсолютно безопасен), во-вторых, erase(iterator) возвращает итератор только в Dinkum STL, по стандарту этот метод возвращает void.
Любите книгу — источник знаний (с) М.Горький
Re[4]: STL: remove_if() на контейнере map используя VC++ 7.1
От: Какая разница Украина  
Дата: 03.08.06 13:06
Оценка:
Здравствуйте, Bell, Вы писали:

BB>Во-первых, этот вариант ничуть не безопасней (в смысле мой вариант абсолютно безопасен), во-вторых, erase(iterator) возвращает итератор только в Dinkum STL, по стандарту этот метод возвращает void.


Точно
посмотрел в STLPort там void
Блин
долбаный Dinkum STL и долбаный MSDN
Кстати у кого там самый свежий MSDN
Там то хоть help по std::map.erase соответствует стандартам
!0xDEAD
Re[5]: STL: remove_if() на контейнере map используя VC++ 7.1
От: Bell Россия  
Дата: 03.08.06 13:17
Оценка:
Здравствуйте, Какая разница, Вы писали:

КР>Здравствуйте, Bell, Вы писали:


BB>>Во-первых, этот вариант ничуть не безопасней (в смысле мой вариант абсолютно безопасен), во-вторых, erase(iterator) возвращает итератор только в Dinkum STL, по стандарту этот метод возвращает void.


КР>Точно

КР>посмотрел в STLPort там void
КР>Блин
КР>долбаный Dinkum STL и долбаный MSDN
КР>Кстати у кого там самый свежий MSDN
КР>Там то хоть help по std::map.erase соответствует стандартам

Вряд ли они теперь сделают по стандарту — из-за совместимости со старым кодом. А вообще стандартный void вызывает немало нареканий. Если интересно — поищи в форуме по "map + erase + void".
Любите книгу — источник знаний (с) М.Горький
Re[5]: STL: remove_if() на контейнере map используя VC++ 7.1
От: vvotan Россия  
Дата: 03.08.06 15:35
Оценка: +1
Здравствуйте, Какая разница, Вы писали:

КР>Здравствуйте, Bell, Вы писали:


BB>>Во-первых, этот вариант ничуть не безопасней (в смысле мой вариант абсолютно безопасен), во-вторых, erase(iterator) возвращает итератор только в Dinkum STL, по стандарту этот метод возвращает void.


КР>Точно

КР>посмотрел в STLPort там void
КР>Блин
КР>долбаный Dinkum STL и долбаный MSDN

Ну конкретно в данном случае имхо у майкрософта сделано в соответствии со здравым смыслом.
--
Sergey Chadov

... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.