模拟任意维数组的类

来源:互联网 发布:即时聊天交友软件 编辑:程序博客网 时间:2024/04/28 20:38

以下是一个可以模拟任意维数组的类.大小可以任意指定.
缺点是创建起来比较麻烦,需要一个维对应的大小的数组.

我已经修改了好几次了。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;
}

 

原创粉丝点击