Класс valarray: операторы и функции

Над двумя объектами класса valarray, а также над объектом и значением определены логические операции ==, !=, <, <=, >, >=, && и ||. Если в операции участвуют два объекта, то сравниваются значения элементов, расположенных на одинаковом смещении. Результатом будет объект valarray с логическими значениями, соответствующими результату сравнения:

std::valarray<int> arr1 = {1, 2, 3}, arr2 = {0, 2, 3};
std::valarray<bool> result = (arr1 == arr2);
std::cout << std::boolalpha;
for (bool &el : result) std::cout << el << ' ';
std::cout << std::endl; // false true true

Если справа или слева от логического оператора расположено значение, а с другой стороны объект valarray, то каждый элемент массива сравнивается с этим значением. Результатом будет объект valarray с логическими значениями, соответствующими результату сравнения:

std::valarray<int> arr = {1, 2, 3};
std::valarray<bool> result = (arr <= 2);
std::cout << std::boolalpha;
for (bool &el : result) std::cout << el << ' ';
std::cout << std::endl; // true true false

Поддерживается также унарный логический оператор !, позволяющий изменить каждое логическое значение на противоположное:

std::valarray<int> arr = {1, 2, 3};
std::valarray<bool> result = (!(arr <= 2));
std::cout << std::boolalpha;
for (bool &el : result) std::cout << el << ' ';
std::cout << std::endl; // false false true

Аналогичным образом можно использовать математические операторы +, -, *, / и %, а также побитовые операторы &, |, ^, << и >>. Результатом будет объект valarray с новыми значениями:

std::valarray<int> arr1 = {1, 2, 3}, arr2 = {0, 2, 3};
// Два объекта valarray
std::valarray<int> result = arr1 + arr2;
for (int &el : result) std::cout << el << ' ';
std::cout << std::endl; // 1 4 6
// Объект valarray и значение (справа или слева от оператора)
std::valarray<int> result2 = arr1 * 2;
for (int &el : result2) std::cout << el << ' ';
std::cout << std::endl; // 2 4 6

Доступны также математические операторы с присваиванием +=, -=, *=, /= и %=, а также побитовые операторы с присваиванием &=, |=, ^=, <<= и >>=. Операции изменяют текущий объект:

std::valarray<int> arr1 = {1, 2, 3}, arr2 = {1, 2, 3};
// Два объекта valarray
arr1 += arr2;
for (int &el : arr1) std::cout << el << ' ';
std::cout << std::endl; // 2 4 6
// Объект valarray и значение
arr2 += 2;
for (int &el : arr2) std::cout << el << ' ';
std::cout << std::endl; // 3 4 5

Существует возможность использования математических унарных операторов + и -, а также побитового унарного оператора ~. Результатом будет объект valarray с новыми значениями:

std::valarray<int> arr = {1, 2, 3};
std::valarray<int> result = -arr;
for (int &el : result) std::cout << el << ' ';
std::cout << std::endl; // -1 -2 -3

Перечислим основные функции для работы с объектами valarray (полный список функций смотрите в документации):

  • abs() — вычисляет абсолютное значение каждого элемента массива и возвращает объект с новыми значениями:
std::valarray<int> arr = {1, -2, -3};
std::valarray<int> result = std::abs(arr);
for (int &el : result) std::cout << el << ' ';
std::cout << std::endl; // 1 2 3
  • pow() — возводит каждое значение массива в степень:
std::valarray<int> arr = {1, 2, 3};
std::valarray<int> result = std::pow(arr, 2);
for (int &el : result) std::cout << el << ' ';
std::cout << std::endl; // 1 4 9

Значения степеней можно задать элементами объекта valarray:

std::valarray<int> arr = {10, 3}, arr2 = {2, 3};
std::valarray<int> result = std::pow(arr, arr2);
for (int &el : result) std::cout << el << ' ';
std::cout << std::endl; // 100 27
  • sqrt() — вычисляет квадратный корень:
std::valarray<int> arr = {25, 100};
std::valarray<int> result = std::sqrt(arr);
for (int &el : result) std::cout << el << ' ';
std::cout << std::endl; // 5 10
  • exp() — вычисляет экспоненту:
std::valarray<double> arr = {1.1, 2.2};
std::valarray<double> result = std::exp(arr);
for (double &el : result) std::cout << el << ' ';
std::cout << std::endl; // 3.00417 9.02501
  • log() — вычисляет натуральный логарифм:
std::valarray<double> arr = {5.0, 8.0};
std::valarray<double> result = std::log(arr);
for (double &el : result) std::cout << el << ' ';
std::cout << std::endl; // 1.60944 2.07944
  • log10() — вычисляет десятичный логарифм:
std::valarray<double> arr = {10.0, 100.0};
std::valarray<double> result = std::log10(arr);
for (double &el : result) std::cout << el << ' ';
std::cout << std::endl; // 1 2
  • sin(), cos(), tan() — стандартные тригонометрические функции (синус, косинус, тангенс):
std::valarray<double> arr = {1.5708, 0.785398};
std::valarray<double> result = std::sin(arr);
for (double &el : result) std::cout << el << ' ';
std::cout << std::endl; // 1 0.707107
  • asin(), acos(), atan() — обратные тригонометрические функции (арксинус, арккосинус, арктангенс).

Применить к каждому элементу массива пользовательскую функцию позволяет метод apply(). В качестве значения метод возвращает новый массив. Прототипы метода:

valarray apply(_Tp func(_Tp x)) const;
valarray apply(_Tp func(const _Tp &x)) const;

Умножим каждое значение на 2:

std::valarray<int> arr = {1, 2, 3, 4, 5};
std::valarray<int> arr2(arr.apply( [](int x){ return x * 2; } ));
for (int &el : arr2) std::cout << el << ' ';
std::cout << std::endl; // 2 4 6 8 10

Учебник C++ (MinGW-W64)
Учебник C++ (MinGW-W64) в формате PDF

Помощь сайту

ЮMoney (Yandex-деньги): 410011140483022

ПАО Сбербанк:
Счет: 40817810855006152256
Реквизиты банка:
Наименование: СЕВЕРО-ЗАПАДНЫЙ БАНК ПАО СБЕРБАНК
Корреспондентский счет: 30101810500000000653
БИК: 044030653
КПП: 784243001
ОКПО: 09171401
ОКОНХ: 96130
Скриншот реквизитов