C++ 声明头中没有大小的动态数组,在.cpp中定义
我正在写一个类,它有一个动态的二维整数数组作为一个字段-最重要的部分,短访问时间是最好的。我想在头文件中声明它C++ 声明头中没有大小的动态数组,在.cpp中定义,c++,dynamic-arrays,C++,Dynamic Arrays,我正在写一个类,它有一个动态的二维整数数组作为一个字段-最重要的部分,短访问时间是最好的。我想在头文件中声明它 //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]; } a
//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=newint*[x];
对于(i=0;i是的,您的方法是有效的和高效的。您(显然)唯一的问题是确保您没有超过限制(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];
}
....
//Grid.h
类网格{
int-maxx,maxy;
int*数组;
公众:
网格(整数x,整数y);
~Grid();
int-Get(int-x,int-y);
}
//制作网格
网格::网格(整数x,整数y)
{
这->maxx=x;
此->最大y=y;
this->array=newint[this->maxx*this->maxy];
}
//破坏电网
网格::~Grid()
{
this->maxx=this->maxy=0;
删除[]此->数组;
这个->数组=NULL;
}
//访问网格
int-Grid::Get(intx,inty)
{
#如果调试
断言(x>=0&&xmaxx);
断言(y>=0&&ymaxy);
#恩迪夫
返回此->数组[y*this->maxx+x];
}
....
+1使对象负责访问和存储…也就是说,使数组私有,并使您的Get/Set访问方法。这样,您可以更改存储实现,而不更改其余代码。不必担心访问方法的效率…它将由编译器/链接器内联到您的代码中,我如果范围检查结果过于昂贵,您可以再次删除它,而无需更改代码的其余部分…不要忘了三条规则!非常好的解释,谢谢。Anbyody想解释一维数组和二维数组在性能/访问时间上的差异吗?您的解决方案需要获取临时指针才能到达最终结果(第二个dim阵列)。(a)使用偏移量x从阵列读取内存。(b)使用偏移量y从结果(a)读取内存以获取实际数据。根据阵列的大小,子阵列可以分散在内存中的所有位置。另一种解决方案可以在寄存器中计算目标地址,并且只有一个内存访问。(a)使用偏移量x*y.Oh从地址数组获取内存,顺便说一句,除非在紧循环中进行大量网格访问,否则速度优势是微乎其微的。