remove_if
не будет работать с ассоциативными контейнерами. Но remove_copy_if
может работать, но за счет копирования вашей карты. Вместо этого я сделаю это с count_if
.
1) Стандартные объекты и методы функций STL, использующие bind + less <>, но без необходимости написания пользовательского функтора
// I don't think it can be done with standard c++ without introducing new functors and adaptors.
std::size_t count = std::count_if( m.begin(), m.end(),
std::sgi::compose1(
std::bind_2nd( std::less<int>(), 3 ),
&boost::get<1,mymap::value_type> ) );
2) Boost.Bind
std::size_t count = std::count_if( m.begin(), m.end(),
boost::compose_f_gx(
&boost::bind( std::less<int>, _1, 3 )
&boost::get<1,mymap::value_type> ) );
3) C ++ 0x Lambdas
std::size_t count = std::count_if( m.begin(), m.end(),
[]( const mymap::value_type& item )
{ return item.second < 3; } );
Если вам действительно нужно поведение remove_if, вам нужно запустить собственный алгоритм. Я не верю, что существуют какие-либо модифицирующие стандартные алгоритмы, которые работают с ассоциативными контейнерами.
template< typename FwdIter, typename AssocCont, typename Pred >
std::size_t assoc_remove_if( FwdIter iter, FwdIter end, AssocCont& cont, Pred pred )
{
std::size_t count = 0;
while( iter != end )
{
if( pred(*iter) )
{
++count;
iter = cont.erase(iter);
}
else
{
++iter;
}
}
return count;
}