Учебник по Visual C++ .Net

         

Шаблон классов valarray Этот шаблон


(i=l; i < size; i++)

cout«"\nx = " « vx[i] «" у = "« vd[i];

Отметьте, что в первой точке (с нулевым индексом) будет ошибка, поэтому мы ее не выводим. Остальные элементы результирующей последовательности чисел (valarray vd) должны вести себя как у = cos(x). В качестве третьего параметра функции adjacent_dif ference нельзя задать просто vd, так как в отличие от обычного массива имя vd не является адресом его первого элемента. Шаблон классов valarray имеет некоторое, весьма ограниченное количество методов, которые позволяют производить манипуляции с данными, среди которых стоит отметить: min, max, sum, shift, cshift, apply. Приведем фрагмент, иллюстрирующий их использование:

//======= Функциональный объект, применяемый к каждому

//======= элементу valarray

double Sharp (double x)

{

return x != 0. ? l/(x*x) : DBL_MAX;

}

//======= Функция для вывода valarray

void out(char* head, valarray<double>& v)

{

cout « '\n' « head << '\n';

for (unsigned i=0; i < v.size(); i++)

cout«"\nv[" « i « "] = " « v[i];

cout «'\n';



}

void main()

{

int size = 11;

valarray<double> vx(size), vy(size);

//======== Заполняем диапазон от -1 до 1

for (int i=0; i < size; i++)

{

vx[i] = i/5. - 1.;

}

out("Initial valarray", vx);

//======== Вычисляем сумму всех элементов

cout « "\nsum = " « vx.sum() « endl;

//======== Применяем свое преобразование

vy = vx.apply (Sharp);

//======== Получили "острую" функцию

out("After apply", vy);

//======== Вычисляем min и max

cout « "\n\nmin = " « vy.min() « " max = " « vy.max();

}

При положительных значениях аргумента метод shift используется для сдвига всей последовательности влево или при отрицательных значениях — вправо. Метод cshif t представляет собой циклическую модификацию метода shift. Заметьте, что все рассмотренные методы возвращают новую последовательность типа valarray и не имеют модификаций, работающих в режиме in-place, что, на мой взгляд, является ощутимым недостатком этого типа данных. Вы можете проверить работу сдвигов, добавив такие строки:

//======== Циклический сдвиг на 2 позиции влево

valarray<double> r =vy.cshift(2);

out("After cyclic 2 digits left shift", r) ;

//======== Сдвиг на 2 позиции вправо

r =r.shift(-2);

out("After 2 digits right shift", r);



Содержание раздела