假设你有一个维度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)]?
以下是(更好或更糟)问题的图形示例。
答案 0 :(得分:2)
您正在使用所谓的锯齿状阵列。它是一个数组数组,除运行时之外什么都不强制子数组的大小相同。因此参差不齐,因为你可以让子阵列的大小不同。
为了使子矩阵也是一个锯齿状数组,你需要存在一个指向子矩阵子阵列的锯齿状指针数组。这些通常不存在,所以不,你不能这样做“不复制”至少一些指向子阵列的指针数组。
如果您的矩阵不是基于锯齿状的数组,而是使用stride的单个数组,那么可以创建子数组的视图而无需分配新的子数组指针数组。此外,它将更加缓存友好。
要编写非锯齿状矩阵,首先要编写一个处理一维的数组视图或span类。
对于两个维度,您可以扩充span类以存储维度大小或步幅的元组。 []
而不是返回对计算元素的引用,创建一个指向计算位置的一维较低跨度实例,直到返回引用的维度为0的情况。
这将是高效的,允许有效的子阵列,但需要几十或100行代码才能正确。