Класс valarray: динамический массив с числовыми значениями

Класс valarray реализует динамический массив с числовыми значениями. Обратите внимание: этот класс не входит в состав STL. Прежде чем использовать класс, необходимо в начало программы добавить инструкцию:

#include <valarray>

Создание объекта

Объявление класса valarray:

template<class _Tp> class valarray;

Для обобщенного типа _Tp создан псевдоним value_type:

typedef _Tp value_type;

Создать объект можно следующими способами (полный список конструкторов смотрите в документации):

  • объявить переменную без инициализации. Для этого перед названием переменной указывается название класса, а после названия внутри угловых скобок задается числовой тип данных. В этом случае массив не содержит элементов. Пример объявления без инициализации:
std::valarray<int> arr;
std::cout << arr.size() << std::endl; // 0
  • указать внутри круглых скобок количество элементов. Все элементы будут иметь значения по умолчанию для типа. Например, для типа int все элементы будут содержать значение 0:
std::valarray<int> arr(5);
for (int &el : arr) std::cout << el << ' ';
std::cout << std::endl; // 0 0 0 0 0
  • в первом параметре указать значение, а во втором — количество элементов. Пример создания массива из 5 элементов со значением 1:
std::valarray<int> arr(1, 5);
for (int &el : arr) std::cout << el << ' ';
std::cout << std::endl; // 1 1 1 1 1
  • перечислить значения через запятую внутри фигурных скобок:
std::valarray<int> arr1{1, 2, 3};
for (int &el : arr1) std::cout << el << ' ';
std::cout << std::endl; // 1 2 3
std::valarray<int> arr2 = {4, 5, 6};
for (int &el : arr2) std::cout << el << ' ';
std::cout << std::endl; // 4 5 6
  • указать объект класса valarray внутри круглых скобок или после оператора = (доступны конструкторы копирования и перемещения):
std::valarray<int> arr1 = {1, 2, 3};
// Создание копии
std::valarray<int> arr2(arr1);
arr2[0] = 55;
for (int &el : arr1) std::cout << el << ' ';
std::cout << std::endl; // 1 2 3
for (int &el : arr2) std::cout << el << ' ';
std::cout << std::endl; // 55 2 3
// Перемещение элементов
std::valarray<int> arr3(std::move(arr1));
for (int &el : arr3) std::cout << el << ' ';
std::cout << std::endl; // 1 2 3
std::cout << arr1.size() << std::endl; // 0
  • в первом параметре передать указатель на обычный массив, а во втором — количество элементов:
const int ARR_SIZE = 3;
int arr[ARR_SIZE] = {1, 2, 3};
std::valarray<int> arr2(arr, ARR_SIZE);
arr2[0] = 55;
for (int &el : arr) std::cout << el << ' ';
std::cout << std::endl; // 1 2 3
for (int &el : arr2) std::cout << el << ' ';
std::cout << std::endl; // 55 2 3
  • указав диапазон с помощью следующих конструкторов:
valarray(const slice_array<_Tp> &sa);
valarray(const gslice_array<_Tp> &ga);
valarray(const mask_array<_Tp> &ma);
valarray(const indirect_array<_Tp> &ia);

Пример (первое значение в конструкторе класса slice означает начальный индекс, второе — количество элементов, а третье — шаг):

std::valarray<int> arr1 = {1, 2, 3, 4, 5, 6};
std::valarray<int> arr2(arr1[std::slice(1, 4, 1)]);
for (int &el : arr2) std::cout << el << ' ';
std::cout << std::endl; // 2 3 4 5

Один объект можно присвоить другому объекту того же размера. В этом случае выполняется поэлементное копирование (оператор копирования) или перемещение элементов (оператор перемещения). Пример:

std::valarray<int> arr1 = {1, 2, 3}, arr2(0, 3), arr3(0, 3);
// Создание копии
arr2 = arr1;
arr2[0] = 55;
for (int &el : arr1) std::cout << el << ' ';
std::cout << std::endl; // 1 2 3
for (int &el : arr2) std::cout << el << ' ';
std::cout << std::endl; // 55 2 3
// Перемещение элементов
arr3 = std::move(arr1);
for (int &el : arr3) std::cout << el << ' ';
std::cout << std::endl; // 1 2 3
std::cout << arr1.size() << std::endl; // 0

Доступно также присваивание элементов из списка инициализации:

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

Если присвоить какое-либо числовое значение, то каждый элемент массива будет иметь это значение:

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

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

valarray<_Tp> &operator=(const slice_array<_Tp> &sa);
valarray<_Tp> &operator=(const gslice_array<_Tp> &ga);
valarray<_Tp> &operator=(const mask_array<_Tp> &ma);
valarray<_Tp> &operator=(const indirect_array<_Tp> &ia);

Обратите внимание: размеры должны совпадать, иначе результат присваивания не определен. Пример:

std::valarray<int> arr1 = {1, 2, 3, 4, 5, 6};
std::valarray<int> arr2(0, 4);
arr2 = arr1[std::slice(1, 4, 1)];
for (int &el : arr2) std::cout << el << ' ';
std::cout << std::endl; // 2 3 4 5

Метод swap() позволяет поменять элементы двух массивов местами:

std::valarray<int> arr1 = {1, 2, 3}, arr2 = {4, 5, 6};
arr1.swap(arr2);
for (int &el : arr1) std::cout << el << ' ';
std::cout << std::endl; // 4 5 6
for (int &el : arr2) std::cout << el << ' ';
std::cout << std::endl; // 1 2 3

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

Помощь сайту

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

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