С++ для начинающих


Алгоритм 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';

}



Содержание раздела