C++ 中任意类型和大小的 N 维数组:
这个答案的灵感来自 Pavel Radzivilovsky 的答案,谢谢。我很难实现实现,因为这是我第一次尝试递归模板。我想分享我所做的事情,以便其他人可以比我更快地理解。
我编写了一个 c++ 模板类来创建一个任意类型和大小的 n 维数组。它需要用数组类型和维数来实例化。大小可以动态更改。我在下面给出了如何创建一个多维数组的裸(剥离)工作版本,其元素可以通过连续应用运算符[](例如数组[x][y][z])来访问。这个版本只能处理维度 n>1 的数组。main 函数以如何创建一个 4 维整数数组为例。
编辑:请记住,下面的示例对于可读性来说是最小的,因为它不会取消分配数组,也不会对访问进行边界检查。添加它是微不足道的,并留给程序员。
#include <stdio.h>
#include <stdlib.h>
template <typename T, int N>
struct array {
array<T,N>() : data(NULL), offset((int*) malloc(sizeof(int)*N)){}
array<T,N>(T *data, int *offset) : data(data), offset(offset){}
array<T,N-1> operator[](int i){return array<T,N-1>(&data[i*offset[N]], offset);}
bool resize(int *size){
offset[N-1] = 1;
int total_size = size[N-1];
for(int i = N-2; i >= 0; i--){
total_size *= size[i];
offset[i] = offset[i+1]*size[i+1];
}
return (data = (T*) realloc (data, total_size*sizeof(T)));
}
T *data;
int *offset;
};
template <typename T>
struct array<T,1>{
array<T,1>(T *data, int *offset) : data(data){}
T& operator[](int i){return data[i];}
T *data;
};
int main () {
array<int, 4> a;
// create array with dimensions [1][3][3][7]
int size[4] = { 1, 3, 3, 7 };
a.resize(size);
a[0][1][2][3] = 123;
return 0;
}
享受。