На этом шаге мы рассмотрим особенности обобщенных срезов.
По аналогии со срезами, определяющими подмножество элементов из одного измерения двухмерного массива, обобщенные срезы предназначены для обработки подмножеств элементов многомерных массивов. Вообще говоря, обобщенные срезы характеризуются теми же свойствами, что и обычные срезы:
Однако в отличие от обычных срезов количество и расстояния между элементами в обобщенных срезах определяются массивами. Количество элементов в таких массивах эквивалентно размерности. Например, обобщенный срез со следующим состоянием эквивалентен обычному срезу, поскольку массив имеет всего одно измерение:
Начальный индекс: 2 Размер: [ 4 ] Шаг: [ 3 ]
Иначе говоря, обобщенный срез определяет четыре элемента на расстоянии 3, начинающихся с индекса 2:
2 5 8 11
Однако обобщенный срез с представленным ниже состоянием фактически создает двухмерный массив:
Начальный индекс: 2 Размер: [2 4] Шаг: [ 10 3 ]
Срез определяет две серии из четырех элементов на расстоянии 3, начиная с индекса 2, разделенных расстоянием 10:
2 5 8 11 12 15 18 21
Пример среза с тремя измерениями:
Начальный индекс: 2 Размер: [ 3 2 4 ] Шаг: [ 30 10 3 ]
Срез содержит следующие серии элементов:
2 5 8 11 12 15 18 21 32 35 38 41 42 45 48 51 62 65 68 71 72 75 78 81
Возможность использования массивов для определения размера и шага является единственным отличием между обычными и обобщенными срезами. В остальном обобщенные срезы ведут себя точно так же.
namespace std { class gslice; template <class T> class gslice_array; template <class T> class valarray { public: // Обобщенный срез константного массива значений // возвращает новый массив значений valarray<T> operator[] (const gslice&) const; // Обобщенный срез неконстантного массива // значений возвращает gslice_array gslice_array<T> operator[] (const gslice&); ... }; }
На следующем шаге мы рассмотрим пример использования обобщенных срезов.