Класс mask_array: диапазон на основе маски

Промежуточный класс mask_array позволяет получить доступ к элементам, для которых соответствующие по позиции элементы внутри массива с логическими значениями имеют значение true. Массив с маской можно создать с помощью операторов сравнения (см. разд. 16.3.8). Объявление класса mask_array:

template <class _Tp> class mask_array;

В классе mask_array доступен только конструктор копирования, поэтому создать экземпляр класса с помощью конструктора нельзя. Для создания объекта следует указать массив с логическими значениями внутри квадратных скобок:

mask_array<_Tp> operator[](const valarray<bool> &m);
valarray<_Tp> operator[](const valarray<bool> &m) const;

Для преобразования объекта класса mask_array в массив нужно передать его конструктору класса valarray или выполнить присваивание (размеры объектов должны совпадать, иначе результат присваивания не определен). Получим элементы со значениями меньшими или равными 2:

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

В классе mask_array перегружены следующие операторы:

void operator=(const _Tp &n) const;
mask_array &operator=(const mask_array &m);
void operator=(const valarray<_Tp> &v) const;
void operator+=(const valarray<_Tp> &v) const;
void operator-=(const valarray<_Tp> &v) const;
void operator*=(const valarray<_Tp> &v) const;
void operator/=(const valarray<_Tp> &v) const;
void operator%=(const valarray<_Tp> &v) const;
void operator&=(const valarray<_Tp> &v) const;
void operator|=(const valarray<_Tp> &v) const;
void operator^=(const valarray<_Tp> &v) const;
void operator<<=(const valarray<_Tp> &v) const;
void operator>>=(const valarray<_Tp> &v) const;

Присвоим нулевое значение всем элементам со значениями меньшими или равными 2:

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

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

Помощь сайту

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

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