2

所以我正在尝试创建一个用于迷宫生成程序的 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);

或者像这样的 3 维对象:

ArbitraryArray testArray(3);

问题是,当我测试它的 depth = 3 然后尝试设置一个整数值时,通过:

testArray.subArray[3].subArray[4].array[4] = 7;

我收到一个运行时错误,让我相信我在动态分配这些对象的方式上做错了。

另外,我包含了一个空的默认构造函数,因为它被以下行调用:

subArray = new ArbitraryArray[5];

我知道这可能不是创建任意维数组数据结构的最佳方法,但我真的很想在可能寻找更好的方法之前弄清楚为什么这个实现不起作用。

我也知道我不应该有这样的一行:

int array[5];

并且它应该是一个指针,这样就不会为底部维度之上的所有级别的数组分配大量浪费的内存。我打算在我得到这个基本想法后对其进行修改。

4

5 回答 5

5

如何使用std::vector分配正确数量的空白内存,这将是

sizeof(T) * dim1 * dim2 * dim3 * ...

然后编写一个辅助类来处理索引,即它会根据给定的(x,y,z,...)计算i,无论你有多少维度。

恕我直言,这种方法的美妙之处在于不必摆弄指针,并且助手类只需实现您喜欢的索引方案(行主要列主要)。

编辑

使用std::valarray时,事情可能会变得更容易,因为您可以使用std::slice和/或std::gslice为您计算索引。

于 2013-08-15T10:23:10.627 回答
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);
        }
    }
};
于 2013-08-14T14:55:25.100 回答
1

好吧,这一次,如果depth大于 2,则创建五个 ArbitraryArray,但将它们的所有指针保存在一个 SubArray 指针中。SubArray 需要是指向 ArbitraryArrays 的指针数组,尝试ArbitraryArray *subArray[5];看看for (int i = 0; i < 5; i++) subArray[i] = new ArbitraryArray(depth - 1)会发生什么。

于 2013-08-14T14:52:52.417 回答
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

要访问数组中的元素,比如 a[2,2,3](基于 0),它可以计算为

a[2*5*5 + 2*5 + 3] 
于 2013-08-15T12:06:06.470 回答
0

只需使用 Boostmulti_array类。它非常灵活、高效并且可以执行边界检查。

于 2013-08-15T13:53:45.123 回答