Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Липпман.doc
Скачиваний:
8
Добавлен:
14.08.2019
Размер:
7.54 Mб
Скачать

Алгоритм remove_copy()

template< class InputIterator, class OutputIterator,

class Type >

OutputIterator

remove_copy( InputIterator first, InputIterator last,


OutputIterator result, const Type &value );

remove_copy() копирует все элементы, кроме имеющих значение value, в контейнер, на начало которого указывает result. Возвращаемый итератор указывает на элемент за последним скопированным. Исходный контейнер не изменяется.

#include <algorithm>

#include <vector>

#include <assert.h>

#include <iostream.h>

/* печатается:

исходный вектор:

0 1 0 2 0 3 0 4 0 5

вектор после remove до erase():

1 2 3 4 5 3 0 4 0 5

вектор после erase():

1 2 3 4 5

массив после remove_copy()

1 2 3 4 5

*/

int main()

{

int value = 0;

int ia[] = { 0, 1, 0, 2, 0, 3, 0, 4, 0, 5 };

vector< int, allocator > vec( ia, ia+10 );

ostream_iterator< int > ofile( cout," ");

vector< int, allocator >::iterator vec_iter;

cout << "исходный вектор:\n";

copy( vec.begin(), vec.end(), ofile ); cout << '\n';

vec_iter = remove( vec.begin(), vec.end(), value );

cout << "вектор после remove до erase():\n";

copy( vec.begin(), vec.end(), ofile ); cout << '\n';

// удалить из контейнера неподходящие элементы

vec.erase( vec_iter, vec.end() );

cout << "вектор после erase():\n";

copy( vec.begin(), vec.end(), ofile ); cout << '\n';

int ia2[5];

vector< int, allocator > vec2( ia, ia+10 );

remove_copy( vec2.begin(), vec2.end(), ia2, value );

cout << "массив после remove_copy():\n";

copy( ia2, ia2+5, ofile ); cout << endl;


}

Алгоритм remove_if()

template< class ForwardIterator, class Predicate >

ForwardIterator

remove_if( ForwardIterator first,


ForwardIterator last, Predicate pred );

remove_if() удаляет из диапазона [first,last) все элементы, для которых значение предиката pred равно true. remove_if() (как и remove()) фактически не исключает удаленные элементы из контейнера. Вместо этого каждый оставляемый элемент перемещается в очередную позицию, начиная с first. Возвращаемый итератор указывает на элемент, следующий за позицией, в которую помещен последний неудаленный элемент. Обычно этот итератор затем передается алгоритму erase(), который удаляет неподходящие элементы. (Для встроенных массивов лучше использовать алгоритм remove_copy_if().)

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


}