Читать «C++: базовый курс» онлайн - страница 319

Herbert Schildt

 for(i=0; i<v.size(); i++)

  cout << v[i];

 cout << endl;

 // Удаляем все буквы 'т'.

 remove_copy(v.begin(), v.end(), v2.begin(), 'Т');

 cout << "После удаления букв 'т' : ";

 for(i=0; v2[i]; i++)

  cout << v2[i];

 cout << endl << endl;

 // **** Демонстрация алгоритма replace_copy ****

 cout << "Входная последовательность: ";

 for(i=0; i<v.size(); i++)

  cout << v[i];

 cout << endl;

 // Заменяем буквы 'о' буквами 'Х'.

 replace_copy(v.begin(), v.end(), v2.begin(), 'о', 'Х');

 cout << "После замены букв 'o' буквами 'Х': ";

 for(i=0; v2[i]; i++)

  cout << v2[i];

 cout << endl << endl;

 return 0;

}

Результаты выполнения этой программы таковы.

Входная последовательность: Это очень простой тест.

После удаления букв 'т': Эо очень просой ес.

Входная последовательность: Это очень простой тест.

После замены букв 'о' буквами 'Х': ЭтХ Хчень прХстХй тест.

Реверсирование последовательности

В программах часто используется алгоритм reverse(), который в диапазоне, заданном параметрами start и end, меняет порядок следования элементов на противоположный. Его общий формат имеет следующий вид.

template <class BiIter>

void reverse(BiIter start, BiIter end);

В следующей программе демонстрируется использование этого алгоритма.

// Демонстрация использования алгоритма reverse.

#include <iostream>

#include <vector>

#include <algorithm>

using namespace std;

int main()

{

 vector<int> v;

 unsigned int i;

 for(i=0; i<10; i++) v.push_back(i);

 cout << "Исходная последовательность: ";

 for(i=0; i<v.size(); i++)

  cout << v[i] << " ";

 cout << endl;

 reverse (v.begin(), v.end());

 cout << "Реверсированная последовательность: ";

 for(i=0; i<v.size(); i++) cout << v[i] << " ";

 return 0;

}

Результаты выполнения этой программы таковы.

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

Реверсированная последовательность: 9876543210

Преобразование последовательности

Одним из самых интересных алгоритмов является transform(), поскольку он позволяет модифицировать каждый элемент в диапазоне в соответствии с заданной функцией. Алгоритм transform() используется в двух общих форматах.

template <class InIter, class OutIter, class Func>

OutIter transform(InIter start, InIter end, OutIter result, Func unaryfunc);

template <class InIter1, class InIter2, class OutIter, class Func>

OutIter transform(InIter1 start1, InIter1 end1, InIter2 start2, OutIter result, Func binaryfunc);

Алгоритм transform() применяет функцию к диапазону элементов и сохраняет результат в последовательности, заданной параметром result. В первой форме диапазон задается параметрами start и end. Применяемая для преобразования функция задается параметром unaryfunc. Она принимает значение элемента в качестве параметра и должна возвратить преобразованное значение. Во второй форме алгоритма преобразование выполняется с использованием бинарной функции, которая принимает в качестве первого параметра значение предназначенного для преобразования элемента из последовательности, а в качестве второго параметра — элемент из второй последовательности. Обе версии возвращают итератор, указывающий на конец результирующей последовательности.