В чем разница betwen boost:: multi_array views и subarrays

После просмотра документации я не могу понять этого.

Я могу написать код, например

typedef boost::multi_array<boost::int32_t, 3> data_t;

// 3d --
typedef data_t::array_view<3>::type data_3d_view_t;

// 2d --
typedef data_3d_view_t::reference data_2d_subarray_t;
typedef data_t::array_view<2>::type data_2d_view_t;

Затем я могу получить доступ к 2d-фрагменту, используя типы data_2d_subarray_t или data_2d_view_t.

В чем разница между ними?
Что я могу сделать с тем, что я не могу сделать с другим?
Есть ли разница в производительности?

Большое спасибо за разъяснение этого мне. С наилучшими пожеланиями, rodrigob.

Ответ 1

Из таблицы Связанные с MultiView типы:

reference Это ссылочный тип содержащегося значения. Если NumDims == 1, то это элемент &. В противном случае это тот же тип, что и шаблон subarray:: type.

template array_view:: type Это тип вида с размерами Dims. Он возвращается вызывающим оператором. Он моделирует MultiArray.

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

Вид позволяет обрабатывать подмножество базовых элементов в MultiArray, как если бы это был отдельный MultiArray. Поскольку представление относится к одним и тем же основным элементам, изменения, внесенные в элементы представления, будут отражены в исходном MultiArray.

MultiArrays определяются рекурсивно; MultiArray размерности n > 1 можно рассматривать как массив MultiArrays размерности n-1, которые являются подмассивами. Ключевое различие между подмассивом и представлением состоит в том, что вы можете нарезать MultiArray на представления меньших размеров вдоль любой оси, включая основную ось, но подмассивы не могут быть нарезаны вдоль главной оси.

data_t d3(boost::extents[4][5][6]);
data_2d_view_t d2_view = d3[boost::indices[range(0,4,2)][1][range(0,6,3)]];
data_2d_subarray_t d2_sub = d3[1];
// the following, and anything like it, won't work 
data_2d_subarray_t d2_sub_b = d3[range(0,4,2)][0];

Я не считаю, что существует какая-либо существенная разница в производительности, хотя это зависит от того, какой тип индекса вы используете при создании представления. Представления могут быть немного менее эффективными, но не в смысле большого О.