C++ 指向二维或三维子数组/子矩阵的指针

C++ 指向二维或三维子数组/子矩阵的指针,c++,arrays,matrix,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=newint*[x]; 对于(int i=0;i您使用的是所谓的锯齿状数组。它是一个数组数组数组,除了运行时外,没有任何东西强制子数组大小相同。因此,锯齿状,因为子数组的大小可能不同 为了使子矩阵也是锯齿状数组,您需要存在指向子矩阵子数组的指针的锯齿状数组。这些指针通常不存在,所以不,您不能

假设你有一个x/y(z)的矩阵,定义如下:

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

对于(int i=0;i您使用的是所谓的锯齿状数组。它是一个数组数组数组,除了运行时外,没有任何东西强制子数组大小相同。因此,锯齿状,因为子数组的大小可能不同

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

如果您的矩阵不是基于交错数组,而是基于单个数组,则可以创建子数组的视图,而无需分配新的子数组指针数组。此外,它将更便于缓存

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

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


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

访问子数组的方式非常有限。请查看以了解原因。顺便说一句。您可以使用
int(*pA3d)[3][4][5]=new int[3][4][5]分配3d数组
但这仅限于固定大小的多维数组。对于不同大小的数组,我会舍弃多维数组,使用一维数组。如果你真的想要这种多维数组,那么std::vector
可以让你的生活更轻松(例如,
std::vector
但是,我更喜欢
std::vector
,自己做多维索引。你可以像特征库那样将它封装在专用的
类MyMatrix
中。)嗯。最好忘记
int(*pA3d)[3][4][5]=新的int[3][4][5];
。我真的不确定指向数组的指针和指向第一个元素的指针是什么。(虽然我记得有一天我出于好奇尝试时掌握了这一点,但这会招来麻烦。)“跨步”是我的下一个想法,但在我写下它之前,你的答案就出现了。因此,我至少修复了一些拼写错误,并添加了一个链接,因为跨步可能并不常见(如果你不知道它的用途)。
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];
}