指向2维或3维子阵列/子矩阵的指针

时间:2017-10-28 09:21:04

标签: c++ arrays matrix

假设你有一个维度x每y(每个z)的矩阵定义如下:

int** tab = new int*[x];
for(int i=0; i<x; ++i) tab[i] = new int[y];

int*** tab = new int**[x];
for(int i=0; i<x; ++i) {
  tab[i] = new int*[y];
  for(int j=0; j<y; ++y) tab[i][j] = new int[z];
}

是否有任何智能方法可以访问子矩阵(get int**(*)没有数据复制,普通C ++),它将具有左上角(-front)角[a,b(,c)]和大小[A,B(,C)]?

以下是(更好或更糟)问题的图形示例。

matrix 2d example enter image description here

1 个答案:

答案 0 :(得分:2)

您正在使用所谓的锯齿状阵列。它是一个数组数组,除运行时之外什么都不强制子数组的大小相同。因此参差不齐,因为你可以让子阵列的大小不同。

为了使子矩阵也是一个锯齿状数组,你需要存在一个指向子矩阵子阵列的锯齿状指针数组。这些通常不存在,所以不,你不能这样做“不复制”至少一些指向子阵列的指针数组。

如果您的矩阵不是基于锯齿状的数组,而是使用stride的单个数组,那么可以创建子数组的视图而无需分配新的子数组指针数组。此外,它将更加缓存友好。

要编写非锯齿状矩阵,首先要编写一个处理一维的数组视图或span类。

对于两个维度,您可以扩充span类以存储维度大小或步幅的元组。 []而不是返回对计算元素的引用,创建一个指向计算位置的一维较低跨度实例,直到返回引用的维度为0的情况。

这将是高效的,允许有效的子阵列,但需要几十或100行代码才能正确。