Выбрать главу

#include iostream.h

int main()

{

vector int, allocator vec;

for ( int ix = 0; ix 20; ix++ )

vec.push_back( ix );

random_shuffle( vec.begin(), vec.end() );

// печатает:

// random_shuffle для последовательности 1 .. 20:

// 6 11 9 2 18 12 17 7 0 15 4 8 10 5 1 19 13 3 14 16

cout "random_shuffle для последовательности 1 .. 20:\n";

copy( vec.begin(), vec.end(), ostream_iteratorint ( cout,""));

}

Алгоритм remove()

template class ForwardIterator, class Type

ForwardIterator

remove( ForwardIterator first,

ForwardIterator last, const Type &value );

remove() удаляет из диапазона [first,last) все элементы со значением value. Этот алгоритм (как и remove_if()) на самом деле не исключает элементы из контейнера (т.е. размер контейнера сохраняется), а перемещает каждый оставляемый элемент в очередную позицию, начиная с first. Возвращаемый итератор указывает на элемент, следующий за позицией, в которую помещен последний неудаленный элемент. Рассмотрим, например, последовательность {0,1,0,2,0,3,0,4}. Предположим, что нужно удалить все нули. В результате получится последовательность {1,2,3,4,0,4,0,4}. 1 помещена в первую позицию, 2 - во вторую, 3 - в третью и 4 - в четвертую. Элементы, начиная с 0 в пятой позиции, - это "отходы" алгоритма. Возвращенный итератор указывает на 0 в пятой позиции. Обычно этот итератор затем передается алгоритму erase(), который удаляет неподходящие элементы. (При работе со встроенным массивом лучше использовать алгоритмы remove_copy() и remove_copy_if(), а не remove() и remove_if(), поскольку его размер невозможно изменить) Алгоритм 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 четное: