Читать «Полный справочник по С++» онлайн - страница 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));