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

Herbert Schildt

 cout << n << " символов представляют гласные звуки.\n";

 return 0;

}

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

Последовательность: STL-программирование -- это сила!

2 символа м

11 символов представляют гласные звуки.

Программа начинается с создания вектора, который содержит строку "STL-программирование - это сила!". Затем используется алгоритм count() для подсчета количества букв 'м' в этом векторе. После этого вызывается алгоритм count_if(), который подсчитывает количество символов, представляющих гласные звуки с использованием в качестве предиката функции isvowel(). Обратите внимание на то, как закодирован этот предикат. Все унарные предикаты получают в качестве параметра объект, тип которого совпадает с типом элементов, хранимых в контейнере, для которого и создается этот предикат. Предикат должен возвращать значение ИСТИНА или ЛОЖЬ.

Удаление и замена элементов

Иногда полезно сгенерировать новую последовательность, которая будет состоять только из определенных элементов исходной последовательности. Одним из алгоритмов, который может справиться с этой задачей, является 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 << "Входная последовательность: ";