29 Numerics library [numerics]

29.7 Numeric arrays [numarray]

29.7.6 The gslice class [class.gslice]

29.7.6.1 The gslice class overview [class.gslice.overview]

namespace std {
  class gslice {
  public:
    gslice();
    gslice(size_t s, const valarray<size_t>& l, const valarray<size_t>& d);

    size_t           start() const;
    valarray<size_t> size() const;
    valarray<size_t> stride() const;
  };
}

Этот класс представляет собой обобщенный фрагмент массива. A gslice определяется начальным смещением (s), набором длин (lj) и набором шагов (dj). Количество длин должно быть равно количеству шагов.

A gslice представляет собой отображение набора индексов (ij), количество которых равно количеству шагов, в один индексk. Это полезно для построения классов многомерных массивов с использованием valarray одномерного шаблона. Набор значений одномерных индексов, заданных agslice :

k=s+jijdj

где многомерные индексыij имеют значения от 0 доlij1.

[ Спецификация Example: gslice

start  = 3
length = {2, 4, 3}
stride = {19, 4, 1}

дает последовательность одномерных индексов

k=3+(0,1)×19+(0,1,2,3)×4+(0,1,2)×1

которые упорядочены, как показано в следующей таблице:

	(i0,i1,i2,k)=
		(0,0,0, 3),    
		(0,0,1, 4),    
		(0,0,2, 5),    
		(0,1,0, 7),    
		(0,1,1, 8),    
		(0,1,2, 9),    
		(0,2,0,11), 
		(0,2,1,12), 
		(0,2,2,13), 
		(0,3,0,15), 
		(0,3,1,16), 
		(0,3,2,17), 
		(1,0,0,22), 
		(1,0,1,23), 
		      
		(1,3,2,36)

То есть индекс с самым высоким порядком получается быстрее всего. ]end example

Возможны вырожденные обобщенные срезы, в которых адрес повторяется.

[ Example: Если параметры шага в предыдущем примере изменить на {1, 1, 1}, первые несколько элементов результирующей последовательности индексов будут

	(0,0,0, 3),  
	(0,0,1, 4),  
	(0,0,2, 5),  
	(0,1,0, 4),  
	(0,1,1, 5),  
	(0,1,2, 6),  
	

end example]

Если вырожденный фрагмент используется в качестве аргумента для не-const версии operator[](const gslice&), поведение не определено.