假设我有一个任意大小的整数值数组,指定要分配的数组的每个维度(级别)的元素数,我如何在不诉诸递归的情况下分配数组?最好在没有递归的情况下执行此操作以避免堆栈溢出。
那么,例如,如何完成这样一个功能:
template <typename Type>
void* allocMulti (int numDim, int* numElementsPerDim)
{
// 'Type' if one-dimensional, should be 'void*' otherwise
void* multiArray = new Type[numElementsPerDim[0]];
// ...
return multiArray;
}
我正在寻找一种通用算法,它可以涵盖没有直接内存访问的语言。
最佳答案
如果数组实际上是一个矩阵(例如长度为 AxB 而不是不同长度的数组列表),那么您可以分配一个长度为 A*B 的数组而不是长度为 A 的数组,其中每个位置都是一个指针到长度为 B 的数组。
这也可以提高性能,因为内存是连续的(更少的分页)。
虽然(假设 dim(a,0) = A 和 dim(a,1) = B.
我的 C++ 有点生疏,但是,我相信这种方法可能有效:
T* AllocateMatrix(int dims, int[] dimLengths)
{
// Assert dims >= 1
int length = dims[0];
for (int d = 1; d < dims; d++)
length *= dims[d];
return new T[length];
}
*T AccessMatrix(T* matrix, int dims, int[] dimLengths, int[] pos)
{
// Assert dims >= 1
int p = pos[0];
for (int d = 1; d < dims; d++)
{
p = p * dimLengths[d] + pos[d];
}
return &matrix[p];
}
关于c++ - 不递归分配多维数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19431068/