将一维动态阵列反演为N维

时间:2017-09-30 20:36:56

标签: c++

帮助理解数组的创建:任务是动态构建一个具有任意数量的测量值及其任意深度的数组。 输入接收具有任意(n)个元素的一维数组int arr []。例如,我们可以创建像int arr= new int[size]这样的一维数组,我们可以创建二维数组int **arr= new int*[size]等等,但是当我们不知道多少维度时,我们怎样才能创建它?我刚开始学习C ++,所以我不能使用面向对象的编程和向量

1 个答案:

答案 0 :(得分:0)

正如其中一些评论者所说,你可以做的一件事是创建一个大的一维数组,而不是多维数组,例如。

int *arr = new int[wLength * zLength * yLength * xLength];

而不是像这样索引arr[w][z][y][x]索引:arr[w * zLength * yLength * xLength + z * yLength * xLength + y * xLength + x]

当然,如果你想要N维数组的类型(给定N是一个常量表达式),你可以使用一个像这样的重载模板:

template <typename T, int N>
struct NDimensionalArray {
    typedef typename NDimensionalArray<T, N-1>::Type *Type;
};

template<typename T>
struct NDimensionalArray<T, 0> {
    typedef T Type;
};

根据该定义,您可以获得以下类型:

std::is_same<NDimensionalArray<char, 1>::Type, char*>::value; // true
std::is_same<NDimensionalArray<char, 2>::Type, char**>::value; // true
std::is_same<NDimensionalArray<char, 3>::Type, char***>::value; // true

封装的N维数组类,用于新建,删除和索引到N维数组,作为练习留下。 (提示:使用std::array<unsigned int, N>表示创建/删除时的大小,以及索引为索引时的索引。