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

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

template <class _Tp> class indirect_array;

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

indirect_array<_Tp> operator[](const valarray<size_t> &i);
valarray<_Tp> operator[](const valarray<size_t> &i) const;

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

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

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

void operator=(const _Tp &n) const;
indirect_array &operator=(const indirect_array &i);
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;

Присвоим нулевое значение всем элементам с индексами 0, 2 и 4:

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

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

Помощь сайту

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

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