cout << n << " символа м\n";

 n = count_if(v.begin(), v.end(), isvowel);

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

 return 0;

}

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

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

2 символа м

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

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

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

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

template

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

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

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

template

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

#include

#include

using namespace std;

int main()

{

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

 vector v, v2(30);

 unsigned int i;

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

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

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

 for(i=0; 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

  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;

}

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

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

Перейти на страницу:

Все книги серии Изучайте C++ с профессионалами

Похожие книги