C++中实现动态多维数组模板的分析-05 - 悲催的科学匠人 - 冷水's blog

C++中实现动态多维数组模板的分析-05

冷水 posted @ 2010年12月29日 04:57 in C++ , 1543 阅读

在分析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_;    // 每个维的范围

  • 无匹配
  • 无匹配

登录 *


loading captcha image...
(输入验证码)
or Ctrl+Enter
Host by is-Programmer.com | Power by Chito 1.3.3 beta | © 2007 LinuxGem | Design by Matthew "Agent Spork" McGee