Этот сайт использует cookies. Продолжение работы с сайтом означает, что Вы согласны!
Класс 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
Помощь сайту
ЮMoney (Yandex-деньги): 410011140483022
ПАО Сбербанк:
Счет: 40817810855006152256
Реквизиты банка:
Наименование: СЕВЕРО-ЗАПАДНЫЙ БАНК ПАО СБЕРБАНК
Корреспондентский счет: 30101810500000000653
БИК: 044030653
КПП: 784243001
ОКПО: 09171401
ОКОНХ: 96130
Скриншот реквизитов