Алгоритм remove_copy_if()
template< class InputIterator, class OutputIterator,
class Predicate >
OutputIterator
remove_copy_if( InputIterator first, InputIterator last,
OutputIterator result, Predicate pred );
remove_copy_if() копирует все элементы, для которых предикат pred равен false, в контейнер, на начало которого указывает итератор result. Возвращаемый итератор указывает на элемент, расположенный за последним скопированным. Исходный контейнер остается без изменения.
#include <algorithm>
#include <vector>
#include <iostream.h>
/* печатается:
исходная последовательность:
0 1 1 2 3 5 8 13 21 34
последовательность после применения remove_if < 10:
13 21 34
последовательность после применения remove_copy_if четное:
1 1 3 5 13 21
*/
class EvenValue {
public:
bool operator()( int value ) {
return value % 2 ? false : true; }
};
int main()
{
int ia[] = { 0, 1, 1, 2, 3, 5, 8, 13, 21, 34 };
vector< int, allocator >::iterator iter;
vector< int, allocator > vec( ia, ia+10 );
ostream_iterator< int > ofile( cout, " " );
cout << "исходная последовательность:\n";
copy( vec.begin(), vec.end(), ofile ); cout << '\n';
iter = remove_if( vec.begin(), vec.end(),
bind2nd(less<int>(),10) );
vec.erase( iter, vec.end() );
cout << "последовательность после применения remove_if < 10:\n";
copy( vec.begin(), vec.end(), ofile ); cout << '\n';
vector< int, allocator > vec_res( 10 );
iter = remove_copy_if( ia, ia+10, vec_res.begin(), EvenValue() );
cout << "последовательность после применения remove_copy_if четное:\n";
copy( vec_res.begin(), iter, ofile ); cout << '\n';
}