boost :: multi_array视图和子数组之间有什么区别

rod*_*gob 11 c++ boost boost-multi-array multidimensional-array

看完文档后我无法想出这个.

我可以写代码等

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;
Run Code Online (Sandbox Code Playgroud)

然后我可以通过类型data_2d_subarray_t或访问使用2d切片data_2d_view_t.

他们之间有什么区别?
对于一个我不能用另一个做的人,我该怎么办?
它有任何性能差异吗?

非常感谢您向我澄清这一点.最好的问候,rodrigob.

out*_*tis 5

MultiView相关类型表中:

reference这是包含值的引用类型.如果NumDims == 1,那么这就是元素&.否则,这与模板子阵列:: type的类型相同.

template array_view :: type这是具有Dims维度的视图类型.它由调用操作符返回.它模拟MultiArray.

所以他们是不同的类型,从一开始.在此上下文中,视图表示MultiArray的一种子集合.它们实现了MultiArray概念,但它们包含的元素实际上是其他MultiArray的元素.视图允许您在MultiArray的元素中定义新索引.例如,您可以定义一个反转索引的视图,以便视图的第一个元素是MultiArray的最后一个元素.从文档:

通过视图,您可以将MultiArray中的基础元素的子集视为单独的MultiArray.由于视图引用相同的底层元素,因此对视图元素所做的更改将反映在原始MultiArray中.

MultiArrays是递归定义的; 维度n > 1 的MultiArray 可以被认为是维数为n -1 的MultiArrays数组,它们是子数组.子阵列和视图之间的主要区别在于,您可以将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];
Run Code Online (Sandbox Code Playgroud)

我不认为有任何重大的性能差异,但这取决于您在创建视图时使用的索引类型.视图的性能可能稍差,但不是很大.