模拟任意维数组的类 以下是一个可以模拟任意维数组的类.大小可以任意指定. 缺点是创建起来比较麻烦,需要一个维对应的大小的数组.
我已经修改了好几次了。BUG我没怎么测试过.估计还有的。但是程序就是这个意思. 各位有兴趣把它修改的好一些.修改了如果有分享精神的话.也让NHSoft知道一下.
我的Email Xheartblue@etang.com
基本能模拟取地址.operator [].任意维大小的分配.
以及智能的内存分配.(在内存里是连续的.只分配了一次内存.)
#include "stdafx.h" #include <iostream> #include <assert.h> using namespace std;
template <typename T,int Dim> class CArray { public: CArray() { m_pArrays = NULL; m_DimSize = 0; m_pData = NULL; }
CArray(int* DimSize,T* pMem = NULL) { m_pData = NULL; Create(DimSize,pMem); }
/* 创建 */ void Create(int* DimSize,T* pMem = NULL) { int size = 1; m_pData = NULL; //内存只有被创建一次 if(pMem == NULL) { for(int i = 0 ; i < Dim; i++) { size *= DimSize[i]; } pMem = new T[size]; m_pData = pMem; }
m_pArrays = new CArray<T,Dim-1>[*DimSize]; m_DimSize = *DimSize ;
int d_Mem = size / m_DimSize ; for(int i = 0; i< m_DimSize ; i++) { m_pArrays[i].Create((DimSize + 1),pMem + d_Mem * i); }
}
T* operator &() { return &(m_pArrays[0]); }
CArray<T,Dim-1>& operator[](int index) { assert(index < m_DimSize && index >= 0); return m_pArrays[index]; }
void Free() { delete [] m_pArrays; m_pArrays = NULL; if(m_pData != NULL) { delete m_pData; m_pData = NULL; cout<<"T 类型内存被释放,该内存统一分配 "<<Dim<<endl; } }
~CArray() { Free(); }
protected: CArray<T,Dim-1>* m_pArrays; int m_DimSize ; T* m_pData;
}; template <typename T> class CArray<T,1> { public: CArray() { m_Data = NULL; m_DimSize = 0; m_bNeedDelete = false; }
CArray(int* DimSize,T* pMem) { m_bNeedDelete = false; Create(DimSize,pMem); } void Create(int size,T* pMem) { if(pMem == NULL) { pMem = new T[size]; m_bNeedDelete = true; } m_Data =pMem; m_DimSize = size; }
T* operator &() { return m_Data; } void Create(int* DimSize,T* pMem) { if(pMem == NULL) { pMem = new T[DimSize[0]]; m_bNeedDelete = true; } m_Data = pMem; m_DimSize = DimSize[0]; } T& operator[](int index) { assert(index < m_DimSize && index >= 0); return m_Data[index]; } void Free() { if( m_bNeedDelete) { delete [] m_Data; m_Data = NULL; cout<<"T 类型内存被释放"<<endl; } }
~CArray() { Free(); }
public: T* m_Data; int m_DimSize ; bool m_bNeedDelete; };
int _tmain(int argc, _TCHAR* argv[]) { int dimSize[4] = {4,6,7,7}; /* CArray 为 4 6 7 7的数组 */ CArray<int , 4> array; array.Create(dimSize); array[2][1][3][1] = 1; int* pT = &(array[2][1][3]); cout<<"pT[0] : "<<pT[1]<<endl;
int* pT2 = &array[2][1]; *pT2 = 234; cout<<"array[2][1][0][0]: "<<array[2][1][0][0]<<endl; cout<<"array[2][1][3][1]: "<<array[2][1][3][1]<<endl; return 0; }
|