返回信息流贴个以前写的模板类,可以用来动态创建数组。这个以前在这个版发过,后来又优化了下。
支持任意维,任意类型,而且任意维索引及数据在内存分布都是连续的。这个类只是个创建器,出来的东西还是个多维数组(多维指针)而已,并非什么新的容器类。
任何在静态声明数组上合法的坐标换算,运算,这个动态数组也都适用,因为各级索引和数据的内存布局和静态声明的高维数组完全一致。
觉着代码头大的,可以先看后面的USAGE。
平时项目一直在用,请放心使用:)
#define SUCCESS 1
#define PTRERR 0
template<class ElemClass, size_t N_Dim>
class IdealArrBuilder : public IdealArrBuilder<ElemClass*, N_Dim-1> {
public:
typedef typename IdealArrBuilder<ElemClass*, N_Dim-1>::ArrType ArrType;
protected:
static ArrType _bldCurDim(size_t sizec, const size_t sizes[], ElemClass lower_dim) {
size_t dim_size = 1;
for (size_t i = 0; i < sizec; ++i)
dim_size *= sizes[i];
ElemClass* higher_dim = new ElemClass[dim_size];
higher_dim[0] = lower_dim;
for (size_t i = 1; i < dim_size; ++i)
higher_dim[i] = higher_dim[i - 1] + sizes[sizec];
return IdealArrBuilder <ElemClass*, N_Dim - 1>::_bldCurDim(sizec - 1, sizes, higher_dim);
}
static ElemClass _freeCurDim(ArrType ptr){
ElemClass * cur_ptr = IdealArrBuilder <ElemClass*, N_Dim - 1>::_freeCurDim(ptr);
if (cur_ptr == NULL) return NULL;
ElemClass lower_ptr = *cur_ptr;
delete [] cur_ptr;
return lower_ptr;
}
public:
static ArrType ialloc(const size_t sizes[]){
size_t dim_size = 1;
for (size_t i = 0; i < N_Dim; ++i)
dim_size *= sizes[i];
ElemClass* base = reinterpret_cast <ElemClass*> (operator new (dim_size*sizeof(ElemClass)));
return IdealArrBuilder <ElemClass*, N_Dim - 1>::_bldCurDim(N_Dim - 1, sizes, base);
}
static ArrType inew(const size_t sizes[]) {
size_t dim_size = 1;
for (size_t i = 0; i < N_Dim; ++i)
dim_size *= sizes[i];
ElemClass* base = new ElemClass[dim_size];
return IdealArrBuilder <ElemClass*, N_Dim - 1>::_bldCurDim(N_Dim - 1, sizes, base);
}
static int ifree(ArrType ptr) {
if (ptr == NULL) return PTRERR;
ElemClass * cur_ptr = IdealArrBuilder <ElemClass*, N_Dim - 1>::_freeCurDim(ptr);
if (cur_ptr == NULL) return PTRERR;
operator delete (cur_ptr);
return SUCCESS;
}
static int idelete(ArrType ptr) {
if (ptr == NULL) return PTRERR;
ElemClass * cur_ptr = IdealArrBuilder <ElemClass*, N_Dim - 1>::_freeCurDim(ptr);
if (cur_ptr == NULL) return PTRERR;
delete [] cur_ptr;
return SUCCESS;
}
};
template <class ElemClass>
class IdealArrBuilder< ElemClass, 0> {
protected:
typedef ElemClass ArrType;
static ArrType _bldCurDim (size_t sizec, const size_t sizes[], ElemClass lower_base) {
return lower_base;
}
static ElemClass _freeCurDim(ArrType ptr){
return ptr;
}
};
/***********************************************
USAGE: //To "NEW" a space.
size_t sizes[] = {2,3,3,3}; //2 is the highest dimension.
MyClass **** my_classes = IdealArrBuilder<MyClass, 4>::inew(sizes) ; //It's the same as MyClass my_classes[2][3][3][3];
IdealArrBuilder<MyClass, 4>::idelete(my_classes); // To delete the space after use.
//To just ALLOCATE
size_t sizes[] = {2,3,3,3}; //2 is the highest dimension.
MyClass **** my_classes = IdealArrBuilder<MyClass, 4>::ialloc(sizes) ;
IdealArrBuilder<MyClass, 4>::ifree(my_classes); // To free the space after use.
**********************************************
MONSTEROUS USAGE:
//To allocate a 10000-dimensional array, the size of each dimension is the N.O. of current dimension.
//O(10^40000). So dont be surprised or disappointed, if it doesn't work :)
size_t sizes[10000];
for (int i = 0; i < 10000; ++i)
sizes[i] = 10000 - i;
IdealArrBuilder<MyClass, 10000>::ArrType my_classes = IdealArrBuilder<MyClass, 10000>::inew(sizes) ;//It means: MyClass my_classes[10000][9999][9998]...[2][1];
IdealArrBuilder<MyClass, 10000>::idelete(my_classes);
***********************************************/
这是一条镜像帖。来源:北邮人论坛 / cpp / #53877同步于 2011/7/2
CPP机器人发帖
Re: 如何new一个五维数组?
fentoyal
2011/7/2镜像同步0 回复
订阅后,新回复会通过你的通知中心匿名送达。
0 条回复
暂无回复 · 你可以订阅本帖等待新回复。