Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
C++ для начинающих.pdf
Скачиваний:
183
Добавлен:
01.05.2014
Размер:
3.97 Mб
Скачать

перемещается в очередную позицию, начиная с 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';

}

Алгоритм replace()

template< class ForwardIterator, class Type > void

replace( ForwardIterator first, ForwardIterator last,

const Type& old_value, const Type& new_value );

replace() заменяет в диапазоне [first,last) все элементы со значением old_value

на new_value.

Алгоритм replace_copy()

template< class InputIterator, class InputIterator, class Type >

OutputIterator

replace_copy( InputIterator first, InputIterator last,

class OutputIterator result,

const Type& old_value, const Type& new_value );

replace_copy() ведет себя так же, как replace(), только новая последовательность копируется в контейнер, начиная с result. Возвращаемый итератор указывает на элемент, расположенный за последним скопированным. Исходный контейнер остается

#include <algorithm> #include <vector> #include <iostream.h>

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

исходная последовательность:

Christopher Robin Mr. Winnie the Pooh Piglet Tigger Eeyore последовательность после применения replace(): Christopher Robin Pooh Piglet Tigger Eeyore

*/

int main()

{

string oldval( "Mr. Winnie the Pooh" ); string newval( "Pooh" );

ostream_iterator< string > ofile( cout, " " ); string sa[] = {

"Christopher Robin", "Mr. Winnie the Pooh", "Piglet", "Tigger", "Eeyore"

};

vector< string, allocator > vec( sa, sa+5 ); cout << "исходная последовательность:\n";

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

replace( vec.begin(), vec.end(), oldval, newval );

cout << "последовательность после применения replace():\n"; copy( vec.begin(), vec.end(), ofile ); cout << '\n';

vector< string, allocator > vec2; replace_copy( vec.begin(), vec.end(),

inserter( vec2, vec2.begin() ), newval, oldval );

cout << "последовательность после применения replace_copy():\n";

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

без изменения.

}

Алгоритм replace_if()

template< class ForwardIterator, class Predicate, class Type

>

void

replace_if( ForwardIterator first, ForwardIterator last, Predicate pred, const Type& new_value );

replace_if() заменяет значения всех элементов в диапазоне [first,last), для которых предикат pred равен true, на new_value.

Алгоритм replace_copy_if()

template< class ForwardIterator, class OutputIterator, class Predicate, class Type >

OutputIterator

replace_copy_if( ForwardIterator first, ForwardIterator last,

class OutputIterator result,

Predicate pred, const Type& new_value );

replace_copy_if() ведет себя так же, как replace_if(), только новая последовательность копируется в контейнер, начиная с result. Возвращаемый итератор указывает на элемент, расположенный за последним скопированным. Исходный контейнер остается без изменения.