Программирование >>  Немодифицирующие последовательные алгоритмы 

1 ... 14 15 16 [ 17 ] 18 19 20 ... 78


count e.cpp: Подсчет количества букв е. . #include <iostream> #include <string> #include <algorithm> using namespace std;

int mainO Для ВС 5.2 требуются изменения (см. ниже) { char *р =

This demonstrates the Standard Template Library ; int n = count(p, p + strlen(p), e); cout n occurrences of e found.\n ; return 0;

В изначальной версии STL алгоритм count не возвращал значение, а использовал четвертый параметр, который увеличивался на найденную величину. Это по-прежнему так для ВС 5.2.

Следующая программа подсчитывает, сколько символов из множества {а, ё, i, о, и} (так называемые гласные) встречаются в заданной строке.

countvwl.срр: Сосчитать, сколько раз гласные

а, е, i, о, U встречаются в заданной строке

(первая версия).

#include <iostream>

iinclude <string>

#include <algorithm>

using namespace std;

int mainO { char *p =

This demonstrates the Standard Template Library ,

*q = p + strlen(p); int n = count(p, q, a) +

count(p, q, e) +

count(p, q, i) +

count(p, q, o) +

count(p, q, u); cout n vowels (a, e, i, o, u) found.\n ;

n = 13 return 0;

К сожалению, этот подход не слишком эффективен, так как заданная строка сканируется пять раз, а мы бы предпочли один проход. Это достигается с помощью алгоритма countjf, которому можно передать функцию, определяющую, удовлетворяется ли требуемое условие. Число параметров функции countjf недавно уменьшилось на один, точно так же, как и у count.



countvw2.срр: Сосчитать, сколько раз гласные

а, е, i, о, U встречаются в заданной строке

(улучшенная версия).

♦include <iostream>

♦include <string>

♦include <algorithm>

using namespace std;

bool found(char ch)

{ return ch == a- II ch == e II ch == i II ch == o I i ch == u;

int main() { char *p =

This demonstrates the Standard Template Library ; int n = count if(p, p + strlen(p), found); cout n vowels (a, e, i, o, u) found.\n ;

n = 13 return 0;

2.4. Функциональные объекты, определенные в STL

Напомним, что такие функции, как found (в предьщущем разделе), называются предикатами. Они возвращают true или fake в зависимости от соблюдения некоторого условия. Выражение greater<int>, которое встретилось нам в разделе 1.11, также является предикатом, но определенным в STL в виде шаблона. Напомним также, что для сортировки последовательности в нисходящем порядке мы использовали это выражение в вызове

sort(а, a+N, greater<int>());

В разделе 2.1 мы применяли похожее выражение multiplies<int>Q в следующем вызове, чтобы указать необходимость выполнения умножения:

int prod = accumulate(а, a+N, 1, multiplies<int>());

Ниже дан полный список таких шаблонов (определенных в заголовке functional), соответствующих стандартным бинарным операциям:

plus<T> minus<T>

multiplies<T> divides<T> modulus<T>

equal to<T> not equal to<T>

greater<T> less<T>

greater equal<T> less equal<T>

logical and<T> logical or<T>



Как известно, выражения типа plus<T>{) являются объектами, другими словами, вышеперечисленные шаблоны, сопровожденные парой круглых скобок,- стандартные функциональные объекты, определенные в библиотеке STL. Кроме этого, существуют шаблоны, соответствующие унарным операторам - (как в выражении -х) и ! (произносится не):

negate<T> logical not<T>

Теперь вернемся к программе countvw2.cpp в конце предыдущего раздела. Она содержит вызов

int п = count if(p, р + strlen(p), found);

где found - определенная нами функция, указывающая, какие символы необходимо подсчитывать. Предположим, что теперь мы хотим подсчитать все символы ch >= к. Очевидно, мы могли бы заменить found на следующую функцию:

bool found(char ch) { return ch >= k; }

Вместо этого возможно использовать упомянутый шаблон greater equal<T>, но нам нужен способ связктъ greater equal<char> со значением k. Это достигается с помощью записи

bind2nd(greater equal<char>(), к)

Указанное выражение может заменить имя функции found в рассматриваемом вызове count if, что дает

п = count if(p, р + strlen(p),

bind2nd(greater equal<char>(), к));

Шаблон bind2nd называется привязкой (являющейся разновидностью адаптера функции). Поскольку два выражения

ch >= к и !(ch < к)

эквивалентны, нас может заинтересовать, допустимо ли использовать некий аналог второго выражения в качестве третьего аргумента функции count if. Это действительно можно сделать, если применить другой тип адаптера функции, называемый отрицателем:

п = count if(p, р + strlen(p),

notl(bind2nd(less<char>(), к)));

Мы обсудим адаптеры функций (и прочие адаптеры) более подробно в главе 6.



1 ... 14 15 16 [ 17 ] 18 19 20 ... 78

© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика