BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / cpp / #53877同步于 2011/7/2
CPP机器人发帖

Re: 如何new一个五维数组?

fentoyal
2011/7/2镜像同步0 回复
贴个以前写的模板类,可以用来动态创建数组。这个以前在这个版发过,后来又优化了下。 支持任意维,任意类型,而且任意维索引及数据在内存分布都是连续的。这个类只是个创建器,出来的东西还是个多维数组(多维指针)而已,并非什么新的容器类。 任何在静态声明数组上合法的坐标换算,运算,这个动态数组也都适用,因为各级索引和数据的内存布局和静态声明的高维数组完全一致。 觉着代码头大的,可以先看后面的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); ***********************************************/
订阅后,新回复会通过你的通知中心匿名送达。
0 条回复
暂无回复 · 你可以订阅本帖等待新回复。