Выбрать главу
Удаление и замена элементов

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

template <class ForIter, class OutIter, class T>

OutIter remove_copy(InIter start, InIter end, OutIter result, const T &val);

Алгоритм remove_copy() копирует с извлечением из заданного диапазона элементы, которые равны значению val, и помещает результат в последовательность, адресуемую параметром result. Алгоритм возвращает итератор, указывающий на конец результата. Контейнер-приемник должен быть достаточно большим, чтобы принять результат.

Чтобы в процессе копирования один элемент в последовательности заменить другим, используйте алгоритм replace_copy(). Его общий формат выглядит так.

template <class ForIter, class OutIter, class T>

OutIter replace_copy(InIter start, InIter end, OutIter result, const T &old, Const T &new);

Алгоритм replace_copy() копирует элементы из заданного диапазона в последовательность, адресуемую параметром result. В процессе копирования происходит замена элементов, которые имеют значение old, элементами, имеющими значение new. Алгоритм помещает результат в последовательность, адресуемую параметром result, и возвращает итератор, указывающий на конец этой последовательности. Контейнер-приемник должен быть достаточно большим, чтобы принять результат.

В следующей программе демонстрируется использование алгоритмов remove_copy() и replace_copy(). При ее выполнении создается последовательность символов, из которой удаляются все буквы 'т'. Затем выполняется замена всех букв 'о' буквами 'Х'.

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

*/

#include <iostream>

#include <vector>

#include <algorithm>

using namespace std;

int main()

{

 char str[] = "Это очень простой тест.";

 vector<char> v, v2(30);

 unsigned int i;

 for(i=0; str[i]; i++) v.push_back(str[i]);

 // **** демонстрация алгоритма remove_copy ****

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

 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);

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