Шаблон классов valarray
Отметьте, что в первой точке (с нулевым индексом) будет ошибка, поэтому мы ее не выводим. Остальные элементы результирующей последовательности чисел (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 используется для сдвига всей последовательности влево или при отрицательных значениях – вправо. Метод cshift представляет собой циклическую модификацию метода 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);