Числовые типы. Обобщенные срезы

   
На этом шаге мы рассмотрим особенности обобщенных срезов.

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

  • начальным индексом;
  • количеством элементов (размером);
  • расстоянием между элементами (шагом).

   
Однако в отличие от обычных срезов количество и расстояния между элементами в обобщенных срезах определяются массивами. Количество
элементов в таких массивах эквивалентно размерности. Например, обобщенный срез со следующим состоянием эквивалентен обычному срезу,
поскольку массив имеет всего одно измерение:

  Начальный индекс: 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

   
Возможность использования массивов для определения размера и шага является единственным отличием между обычными и обобщенными срезами.
В остальном обобщенные срезы ведут себя точно так же.

  • Чтобы определить подмножество элементов массива значений, достаточно передать обобщенный срез в аргументе оператора [].
  • Для константных массивов значений результат представляет собой новый массив значений.
  • Для неконстантных массивов значений итоговое выражение представляет собой объект gslice_array, представляющий набор элементов
    массива значений со ссылочной семантикой:

    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&);
    	        ...
    	    };
    	}
    
  • Для класса gslice_array определены операторы присваивания (обычные и комбинированные), позволяющие модифицировать элементы подмножества.
  • Преобразования типа позволяют объединять обобщенные срезы с другими массивами значений и подмножествами их элементов (смотри 433 шаг).

   
На следующем шаге мы рассмотрим пример использования обобщенных срезов.



Вы можете оставить комментарий, или Трекбэк с вашего сайта.

Оставить комментарий