Читать «Полный справочник по С++» онлайн - страница 421
Герберт Шилдт
■Содержимое массива: 0123456789 10 11 Результат: 03625847 10
Вспомогательные классы
Числовые классы используют вспомогательные классы slice_array, gslice_array, indirect_array и mask_array, которые никогда не конкретизируются явно.
У*1 Числовые алгоритмы
Заголовок <numeric> содержит определения четырех числовых алгоритмов, предназначенных для обработки содержимого контейнера. Рассмотрим каждый из них.
Класс accumulate
Алгоритм accumulate О вычисляет сумму всех элементов указанного диапазона и возвращает результат. Его прототип выглядит следующим образом.
I template cclass Inlter, class T>
T accumulate(Inlter start, Inlter end, T v) ; template cclass Inlter, class T, class BinFunc>
T accumulate (Inlter start, Inlter end, T v, BinFunc func) ;
Здесь класс т описывает тип значений, которыми оперирует алгоритм Первая версия алгоритма вычисляет сумму всех элементов диапазона, ограниченного итераторами start и end. Функция func во второй версии определяет порядок суммирования элементов. Параметр v задает начальное значение, с которого начинается суммирование. Рассмотрим программу, иллюстрирующую алгоритм accumulate.
// Демонстрация алгоритма accumulate.
♦include ciostream>
♦include cvector>
♦ include cnumerio using namespace std;
int main()
{
vectorcint> v(5); int i, total;
for(i=0; ic5; i++) v[i] = i; total = accumulate (v.begin () , v.endO, 0); cout cc "Сумма элементов массива v: ” cc total; return 0;
}
Результат работы программы приведен ниже.
| Сумма элементов массива v: 10
Алгоритм adj acen t_d iff erence
Алгоритм adjacent_difference() создает новую последовательность, каждый элемент которой равен разности между соседними элементами исходной последовательности. (Первый элемент в результирующей последовательности равен первому элементу исходного массива.) Прототипы алгоритма adjacent_difference() приведены ниже.
I template cclass Inlter, class 0utlter>
Outlter adjacent_difference(lnlter start,
Inlter end, Outlter result) ;
I template cclass Inlter, class Outlter, class BinFuno Outlter adjacent_difference(lnlter start, Inlter end,
Outlter result, BinFunc func) ;
Здесь параметры start и end являются итераторами, установленными па начало и конец исходной последовательности. Результирующая последовательность хранится в объекте, на который ссылается итератор resut. Первая версия алгоритма вычисляет разность между соседними элементами, вычитая элемент, занимающий п-ю позицию, из элемента, занимающего и+1-ю позицию. Во второй версии к каждой паре соседних элементов применяется бинарная функция func. Алгоритм возвращает итератор result. Рассмотрим пример применения алгоритма adjacent_difference().
// Демонстрация алгоритма adjacent_difference()
♦include <iostream>
♦include <vector>
♦include cnumerio using namespace std;
int main()
{
vector<int> v(10), r(10); int i ;
for(i=0; i<10; i++) v[i] = i*2; cout « "Исходная последовательность: ”; for(i=0; i<10; i++) cout « v[i] « " "; cout « endl;
adjacent_difference(v.begint), v.end(), r.beginf));