代码之家  ›  专栏  ›  技术社区  ›  rodrigob

boost::多数组视图和子数组之间的区别是什么

  •  11
  • rodrigob  · 技术社区  · 14 年前

    在查阅了文档之后,我想不出这个问题。

    我可以编写如下代码

    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;
    

    然后我可以通过类型访问二维切片 data_2d_subarray_t data_2d_view_t .

    他们之间有什么区别?
    一个我做不到另一个我能做什么?
    有什么性能差异吗?

    非常感谢你向我澄清这件事。 谨致问候, 罗德里戈。

    1 回复  |  直到 14 年前
        1
  •  5
  •   outis    14 年前

    从桌子上 MultiView associated types :

    引用这是包含值的引用类型。如果NumDims==1,则这是element&元素;。否则,这与template subarray::type的类型相同。

    模板数组视图::类型这是具有尺寸标注的视图类型。由呼叫接线员返回。它是多阵列的模型。

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

    视图允许您将多数组中底层元素的子集视为单独的多数组。由于视图引用相同的底层元素,因此对视图元素所做的更改将反映在原始多数组中。

    多数组是递归定义的;多维数组 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];
    

    我不认为存在任何主要的性能差异,尽管这取决于创建视图时使用的索引类型。视图的性能可能稍差一些,但不是很大。