Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 任意维数组_C++_Arrays - Fatal编程技术网

C++ 任意维数组

C++ 任意维数组,c++,arrays,C++,Arrays,所以我试图创建一个n维数组结构,用于迷宫生成程序 我简化了我的问题(目的是在将其模板化并添加所有必要的辅助函数之前,尝试弄清楚理论) 因此,我目前的问题归结为想要创建一个ArricryArray类,该类将一个参数引入到它的构造函数中,并指定维度的数量。每个尺寸的长度为5。(目前) 这就是我到目前为止所做的: class ArbitraryArray{ public: int array[5]; ArbitraryArray*subArray; ArbitraryArra

所以我试图创建一个n维数组结构,用于迷宫生成程序

我简化了我的问题(目的是在将其模板化并添加所有必要的辅助函数之前,尝试弄清楚理论)

因此,我目前的问题归结为想要创建一个ArricryArray类,该类将一个参数引入到它的构造函数中,并指定维度的数量。每个尺寸的长度为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];

它应该是一个指针,这样就不会有大量的内存浪费分配给数组底部维度以上的所有级别。我打算在这一基本思想发挥作用后对其进行修改。

好吧,这一次,如果
深度大于2,则创建五个任意数组,但将它们的所有指针保存在一个子数组指针中。子数组需要是指向ArricryArray的指针数组,请尝试
ArricryArray*子数组[5]
的代码>和
,看看会发生什么。

没有编译任何东西,只是目视检查。那么这个呢:

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);
        }
    }
};
模板
类任意数组{
公众:
int数组[数组长度];
任意阵列**子阵列;
任意数组(){}
任意数组(整数深度){
如果(深度==1)
子阵=0;
否则{
子阵列=新的任意阵列*[array_length];
for(int i=0;i
如何使用std::vector来分配正确数量的空白内存,这将是

sizeof(T) * dim1 * dim2 * dim3 * ...
然后编写一个帮助器类来处理索引,即,它将根据给定的(x,y,z,…)计算i,不管您有多少维度

IMHO这种方法的优点在于不必处理指针,而helper类只需实现一个符合您偏好(或)的索引方案

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

在您的示例中,您创建的是一个遍布内存的数组,而不是一个存储在连续内存块中的数组。这可能会导致一些问题,具体取决于您对内存的处理。e、 g.在上面使用memcpy永远不会起作用

我认为更灵活一点的方法是创建一个大数组,并根据维度的数量在数组中建立索引

int n = static_cast<int>(pow( 5.0, static_cast<double>(depth) ));   
Type* a = new Type[ n ]; 

只需使用Boost
multi_数组
类。它非常灵活、高效,可以执行边界检查


为什么不使用一个
std::vector
并使用
at(x,y)
函数索引到其中,该函数使用
y*行长度+x来计算它?这有点容易…你所指的一般原理是有效的,我也考虑过使用它。尽管您这样说,它只适用于2d阵列。您需要重复进行除法和MOD以获得任意维度。但是,是的,我考虑过使用一个一维数组,其长度为维1*维2*…*维n。甚至可以尝试一下。现在我只是想让这个实现正常工作。你需要为迷宫的每个单元都设置一个项目吗?您可能更喜欢稀疏数组,在C++中,它意味着一个STD::MAP或STD::unOrdEdjMmap,其中每个键是一组完整的坐标。只是一个轻微的键入。它应该是子数组=新的任意数组*[array_length]@大卫·曼德尔:谢谢,修好了。这回答了你的问题吗?如果是这样,请表现出爱,点击+1并接受答案。这是我们在StackOverflow(欢迎!)上使用的方式,但它需要15个声誉。出于某种原因,这个问题,我认为我花了足够的时间让它在这个网站上变得体面,被降为0。哦,好吧。你不能取悦互联网上的任何人你现在在这个问题上回到了1:)
a[2*5*5 + 2*5 + 3]