C++ 任意维数组
所以我试图创建一个n维数组结构,用于迷宫生成程序 我简化了我的问题(目的是在将其模板化并添加所有必要的辅助函数之前,尝试弄清楚理论) 因此,我目前的问题归结为想要创建一个ArricryArray类,该类将一个参数引入到它的构造函数中,并指定维度的数量。每个尺寸的长度为5。(目前) 这就是我到目前为止所做的:C++ 任意维数组,c++,arrays,C++,Arrays,所以我试图创建一个n维数组结构,用于迷宫生成程序 我简化了我的问题(目的是在将其模板化并添加所有必要的辅助函数之前,尝试弄清楚理论) 因此,我目前的问题归结为想要创建一个ArricryArray类,该类将一个参数引入到它的构造函数中,并指定维度的数量。每个尺寸的长度为5。(目前) 这就是我到目前为止所做的: class ArbitraryArray{ public: int array[5]; ArbitraryArray*subArray; ArbitraryArra
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](int i=0;i<5;i++)子数组[i]=新的任意数组(深度-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);
}
}
};
模板
类任意数组{
公众:
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 ];
只需使用Boostmulti_数组
类。它非常灵活、高效,可以执行边界检查
为什么不使用一个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]