|
Программирование >> Немодифицирующие последовательные алгоритмы
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.
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |