我正在编写一个具有动态二维整数数组作为字段的类 - 最重要的一部分,短访问时间是首选。我想在头文件中声明它,
//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
代码。
答案 0 :(得分:3)
是的,您的方式有效且有效。唯一的问题(显然)是确保你没有超过限制(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];
}
....