C ++ 0x (с использованием лямбды):
container.erase( std::remove_if( container.begin(), container.end(),
[]( int v ) { return v > 2; } ),
container.end() );
Причина erase
в сочетании с remove_if
заключается в том, что алгоритмы STL применяются к итераторам, а не к контейнерам. Они перемещают содержимое контейнера, но не изменяют контейнер как таковой.
C ++ 03:
container.erase( std::remove_if( container.begin(), container.end(),
std::bind2nd( std::greater<int>(), 2 ) ),
container.end() );
Это может показаться немного более простым, но также менее гибким, так как предикаты уже определены. Для более сложных операций вам придется написать собственный функтор предикатов.