C++中实现动态多维数组模板的分析-05 - 悲催的科学匠人 - 冷水's blog
C++中实现动态多维数组模板的分析-05
在分析04中,我写出了多维编号到一维编号的转换关系。不过那时假设多维编号采用C风格,都是从0开始的。实际我需要支持非0开始的编号,即可以从任一一个整数a开始以1递增到另外一个不小于a的整数b。在这种情况下,要将非0开始的多维编号转换为内部以0开始的编号,就可以使用前述的公式了。
这次,开始进行设计。
首先命名这个类为 arrayindex
它必须具备的最重要的方法有
1 根据给定的维数和每个维的范围创建一个实例
ArrayIndex(size_t ndim, int ranges[][2]);
ndim是一个非负数,表示维数。range是每个维的范围range[i][0]是起始编号,
range[i][1]是终止编号。为了方便,令i>=1
2 从一个多维编号转换到一维编号
size_t Getsidx(int a_midx[], int& o_stat);
a_midx[]存储多维编号,为方便起见,从a_mix[1]开始有效。
3 从一个一维编号转换到多维编号
void Getmidx(size_t a_sidx, int o_midx[]);
这个类的关键成员应该包含
size_t length_; // 数组数据总个数
size_t ndim_; // 维数
size_t maxdim_; // 最大维数
size_t *dims_; // 每个维的尺寸
size_t *size_; // 每个维度上切片的尺寸。比如,数组[5][3][2],第一维是一维的串,它的切片就是单个元素,尺寸为1;第二维是一个二维的片,其切片是低一维的串,每个串的尺寸是5;第三维是一个三维块,其切片是低一维片,尺寸是5X3。如此类推到更高维。
size_t **shift_; // 每个维上所有标号的偏移。比如数组[5][3][2],按照我们先前的分析,必须存储第一维的5个偏移,第二维的3个偏移和第三维的2个偏移。因此shift_是个二维数组。
int **range_; // 每个维的范围