3

我正在编写一个具有动态二维整数数组作为字段的类 - 其中最重要的部分是较短的访问时间。我想在头文件中声明它,

//Grid.h
class Grid{
  int ** array;
}

然而,它的大小和内容尚未在 cpp 文件中实现的构造函数中定义(可能是从 ini 文件中读取)。

我不确定是否int **array在标头中声明一个指针并稍后使用

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

将导致创建一个可访问的数组,并且在其他函数直接调用array[i][j]其定义中的字段(或其他不太明显的错误)时不会造成麻烦,但是在提到的函数开始调用之前,它会并且必须是已经定义了。

我的问题-这是有效且有效的方法吗?我会接受任何其他想法。
是的,我听说过“向量”类,但我不确定它的效率或读写与整数数组的性能。向量的大小是灵活的,但我不需要它——我的数组一旦设置,就会有固定的大小。

可能我只是太习惯于 Java 风格的int[][] array代码。

4

1 回答 1

4

是的,您的方式是有效的。你唯一的问题(显然)是确保你不超过限制(Java为你检查,使用C你必须确保你在[0...x-1]之间。

但是,如果您说的是高效率,那么更有效的方法是创建一个一维数组并乘以您的方式。这在内存使用(尤其是小尺寸)和访问时间方面会更有效。您可能会在网格类 (Grid::Set(value, x,y), Grid::Get(x,y)) 中包装访问函数,并自己检查大小是否超限。

//Grid.h
class Grid{
    int maxx, maxy;
    int *array;

  public: 
     Grid(int x, int y);
     ~Grid();
     int Get(int x, int y);
}


// making the grid
Grid::Grid(int x, int y) 
{
    this->maxx= x; 
    this->maxy= y;
    this->array= new int[this->maxx*this->maxy];  
}

// destroying the grid
Grid::~Grid() 
{
    this->maxx= this->maxy= 0;
    delete []this->array;  
    this->array= NULL;
}

// accessing the grid
int Grid::Get(int x, int y)
{
#if DEBUG
    assert(x>=0 && x<this->maxx);
    assert(y>=0 && y<this->maxy);
#endif
    return this->array[ y*this->maxx + x];
}
....
于 2013-06-04T12:24:39.573 回答