Иллюстрированный самоучитель по Visual Studio .NET

Шаблон классов 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);
Если Вы заметили ошибку, выделите, пожалуйста, необходимый текст и нажмите CTRL + Enter, чтобы сообщить об этом редактору.