Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/141.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ boost::multi_阵列视图和子阵列之间的区别是什么_C++_Boost_Multidimensional Array_Boost Multi Array - Fatal编程技术网

C++ boost::multi_阵列视图和子阵列之间的区别是什么

C++ boost::multi_阵列视图和子阵列之间的区别是什么,c++,boost,multidimensional-array,boost-multi-array,C++,Boost,Multidimensional Array,Boost Multi 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>

看了文档后,我想不出这一点

我可以编写如下代码

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;
typedef boost::多数组数据;
//三维--
typedef data_t::array_view::type data_3d_view\t;
//二维--
typedef data_3d_view_t::reference data_2d_subarray_t;
typedef data_t::array_view::type data_2d_view\t;
然后我可以通过类型
data\u 2d\u subarray\u t
data\u 2d\u view\u t
访问2d切片

他们之间有什么区别
我能用一个做什么,而不能用另一个做什么
性能有什么不同吗

非常感谢你向我澄清这一点。 顺致敬意, rodrigob.

来自以下表格:

reference这是包含值的引用类型。如果NumDims==1,则这是元素&。否则,该类型与模板子数组::类型相同

template array_view::type这是具有Dims维度的视图类型。它由呼叫操作员返回。它模拟多阵列

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

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

多数组是递归定义的;维数n>1的多数组可以看作是维数n-1的多数组的数组,它们是子数组。子阵列和视图之间的关键区别在于,可以沿任意轴(包括长轴)将多阵列切片为低维视图,但子阵列不能沿长轴切片

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];

我不认为有任何主要的性能差异,尽管这取决于创建视图时使用的索引类型。视图的性能可能会稍差一些,但不是从大O的角度来看。

谢谢您的回答!这正是我要找的!尽管根据我以前的经验,我认为通常子阵列的性能要比视图好得多(在“大O”的意义上是“k”)。