Классы slice и slice_array: диапазон значений

Класс slice позволяет задать диапазон значений. Конструкторы класса:

slice();
slice(size_t start, size_t size, size_t stride);

Параметр start задает начальный индекс, параметр size — количество элементов, а параметр stride — шаг. Получить эти значения после создания объекта позволяют методы start(), size() и stride(). Прототипы методов:

size_t start() const;
size_t size() const;
size_t stride() const;

Пример создания объекта и получения значений:

std::slice obj(1, 4, 2);
std::cout << obj.start() << std::endl;  // 1
std::cout << obj.size() << std::endl;   // 4
std::cout << obj.stride() << std::endl; // 2

Можно создать копию объекта или выполнить перемещение:

std::slice obj1(1, 4, 2);
std::slice obj2(obj1);
std::cout << obj2.start() << std::endl;  // 1
std::cout << obj2.size() << std::endl;   // 4
std::cout << obj2.stride() << std::endl; // 2

Для получения диапазона значений (среза) массива нужно указать объект класса slice внутри квадратных скобок:

slice_array<_Tp> operator[](slice s);
valarray<_Tp> operator[](slice s) const;

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

template<typename _Tp> class slice_array;

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

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

Объект класса slice_array содержит ссылки на элементы исходного массива. Все изменения этого объекта приведут к изменениям в исходном массиве. Например, присвоим нулевое значение всем элементам с четными индексами:

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

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

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

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

Помощь сайту

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

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