所以我正在尝试创建一个用于迷宫生成程序的n维数组结构。
我已经简化了我的问题(为了试图在使其理论化并添加所有必要的帮助函数之前弄清楚理论)
所以我的问题目前归结为想要创建一个ArbitraryArray类,它接受一个指定维数的构造函数的参数。每个维度的长度= 5.(现在)
这是我到目前为止所做的:
class ArbitraryArray{
public:
int array[5];
ArbitraryArray*subArray;
ArbitraryArray(){}
ArbitraryArray(int depth){
if (depth == 2) subArray = new ArbitraryArray[5];
else if (depth > 2) for (int i = 0; i < 5; i++) subArray = new ArbitraryArray(depth - 1);
}
};
我会像这样创建一个二维对象:
ArbitraryArray testArray(2);
或者像这样的三维物体:
ArbitraryArray testArray(3);
问题是,当我测试深度= 3然后尝试设置整数值时,通过:
testArray.subArray[3].subArray[4].array[4] = 7;
我收到了一个运行时错误,让我相信我在如何动态分配这些对象方面做错了。
另外,我包含了一个空的默认构造函数,因为它被以下行调用:
subArray = new ArbitraryArray[5];
我知道这可能不是创建任意维数组数据结构的最佳方法,但我真的想弄清楚为什么这个实现在寻找更好的方法之前不起作用。
我也知道我不应该有这样一句话:
int array[5];
它应该是一个指针,以便在底部维度之上的阵列的所有级别上没有浪费大量内存。在我得到这个基本想法之后,我打算将其修改为。
答案 0 :(得分:5)
如何使用 std :: vector 分配正确数量的空白内存,这将是
sizeof(T) * dim1 * dim2 * dim3 * ...
然后编写一个负责索引的辅助类,即从给定的(x,y,z,...)计算 i ,无论如何您可能拥有的多个维度。
这种方法的优点,恕我直言,在于不必乱用指针,辅助类只是实现了你的偏好的索引方案(row major或column major)。
使用 std :: valarray 时,事情可能变得更容易,因为你可以使用 std :: slice 和/或 std :: gslice 为您计算索引。
答案 1 :(得分:1)
好吧,一次,如果depth
大于2,则创建五个ArbitraryArrays,但是将所有指针保存在一个SubArray指针中。 SubArray需要是一个指向ArbitraryArrays的指针数组,尝试ArbitraryArray *subArray[5];
和for (int i = 0; i < 5; i++) subArray[i] = new ArbitraryArray(depth - 1)
,看看会发生什么。
答案 2 :(得分:1)
没有编译任何东西,只是视觉检查。那怎么样:
template<int array_length>
class ArbitraryArray{
public:
int array[array_length];
ArbitraryArray ** subArray;
ArbitraryArray(){}
ArbitraryArray(int depth){
if (depth == 1)
subArray = 0;
else {
subArray = new ArbitraryArray*[array_length];
for (int i = 0; i < array_length; i++)
subArray[i] = new ArbitraryArray(depth - 1);
}
}
};
答案 3 :(得分:1)
在您的示例中,您创建的数组遍布内存中的所有位置,而不是存储在连续内存块中的一个数组。这可能会导致一些问题,具体取决于您处理内存。例如使用memcpy永远不会有效。
我认为一种更灵活的方法是创建一个大型数组,而是根据维数创建一个数组索引
int n = static_cast<int>(pow( 5.0, static_cast<double>(depth) ));
Type* a = new Type[ n ];
即。因为你的数组大小是5,2-dim大小是5x5和3-dim 5x5x5
访问数组中的元素说[2,2,3](从0开始)它可以计算为
a[2*5*5 + 2*5 + 3]
答案 4 :(得分:0)
只需使用Boost multi_array
类。它非常灵活,高效,可以执行边界检查。