Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
###Cpp_лкц1_1.09_11_#дляБАК#29_01_12.doc
Скачиваний:
40
Добавлен:
29.04.2019
Размер:
6.42 Mб
Скачать

Часть III. Стандартная библиотека

#include <iostream>

#include <numeric>

#include functional>

using namespace std;

int sumkv( int s. int x){ return s + x * x;}

int main(){

const int m = 5;

int a[m] = {3, 2. 5. 1, 6}. sum = 0, mul = 1. sum2 = 0;

cout « accumulate(a, a + m, sum) « endl;

cout « accumulated, a + m, mul. multiplies<int>0) « endl;

cout « accumulate(a. a + m, sum2. sumkv) «endl; return 0; }

inner_product

Первая форма алгоритма inner_product используется для вычисления скалярного произведения двух последовательностей (скалярным произведением последовательностей а и b является выражение Zaj*bj). Начальное значение произведения задается четвертым параметром. Тип этого параметра определяет тип результата (функция возвращает вычисленное произведение):

template t<class Inl. class In2. class T>

T inner_product(Inl firstl, Inl lastl. In2 first2. T init);

Вторая форма алгоритма innerjproduct используется для выполнения над двумя последовательностями действий, заданных с помощью двух функций или функциональных объектов. Первый используется вместо операции сложения, второй — вместо умножения:

template t<class Inl, class In2, class T, class BinOpl, class Bin0p2> T inner_product(Inl firstl, Inl lastl, In2 first2. T init. BinOpl binary_opl, Bin0p2 binary_op2);

Следующий вызов вычисляет произведение сумм соответствующих элементов последовательностей а и Ь:

cout « inner_product(a, а + m, b, mul. multiplies<int>(), plus<int>0);

partial_sum

Алгоритм parti al_sum формирует последовательности из частичных сумм элементов. Например, для последовательности чисел 3 12 3 5 результатом будет 3 4 6 9 14, то есть каждый элемент результата равен предыдущему элементу, увеличенному на текущий элемент исходной последовательности.

Вместо суммы четвертым параметром можно задать другую операцию. Результат можно поместить и в исходную последовательность, для этого третьим парамет-

Глава 15. Средства для численных расчетов

371

ром указывается итератор на ее начало. Функция возвращает итератор на элемент, следующий за концом результирующей последовательности.

template t<class In, class Out>

Out partial_sum(In first, In last. Out result); template t<class In, class Out, class BinOp>

Out partial_sum(In first. In last, Out result, BinOp binary_op);

adjacent_difference

Алгоритм adjacent_difference выполняет вычисление разности между смежными элементами, то есть d-j = a-j - a-j_i. Вместо разности четвертым параметром можно задать другую операцию. Функция возвращает итератор на элемент, следующий за концом результирующей последовательности.

template t<class In, class Out>

Out adjacent_difference(In first, In last. Out result); template t<class In, class Out, class BinOp>

Out adjacent_difference(In first, In last. Out result, BinOp binary_op);

Этот алгоритм является обратным предыдущему, то есть вызов для одной и той же последовательности сначала одного, а потом другого алгоритма приведет к исходной последовательности.

Класс valarray

Для эффективной работы с массивами чисел в стандартной библиотеке определен шаблонный класс valarray. Операции с этим классом реализованы с расчетом на их поддержку в архитектурах высокопроизводительных систем. В библиотеке описаны также четыре вспомогательных класса, позволяющих получить различные подмножества valarray: slice_array, gslice_array, mask_array и indirect_array. Все эти классы реализованы как шаблоны классов с параметром, представляющим собой тип элемента массива.

Для использования класса valarray и связанных с ним средств требуется подключить к программе заголовочный файл <valarray>. В нем описаны, кроме перечисленных шаблонов классов, классы si ice и gsl ice, задающие подмножества индексов массива, а также заголовки функций, предназначенных для работы с этими шаблонами и классами.

Шаблон slice_array представляет собой строку, столбец или другое регулярное подмножество элементов valarray (например, его четные элементы). С помощью этого шаблона можно представлять valarray как матрицу произвольной размерности.

Шаблон gslice_array позволяет задавать более сложные законы формирования подмножества массива, a mask_array — произвольные подмножества с помощью битовой маски. Шаблон indirect_array содержит не сами элементы массива, и их индексы,

372