找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 331|回复: 1

[转贴]:模拟任意维动态数组的类

[复制链接]
发表于 2004-7-4 16:41:28 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
[转贴]模拟任意维动态数组的类

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

基本能模拟取地址.operator [].任意维大小的分配.

以及智能的内存分配.(在内存里是连续的.只分配了一次内存.)

[php]
#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;
   }
            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.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;
}
[/php]
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
发表于 2004-7-5 00:39:57 | 显示全部楼层
好文章!
怪不得有这样的声明:

  1.   [FONT=courier new]
  2. class AsdkInputPointFilter : public AcEdInputPointFilter
  3. ..............
  4.           const AcArray<AcGeCurve3d*>&       alignmentPaths,
  5. ..............
  6.   [/FONT]
复制代码
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|申请友链|Archiver|手机版|小黑屋|辽公网安备|晓东CAD家园 ( 辽ICP备15016793号 )

GMT+8, 2024-9-21 21:50 , Processed in 0.173446 second(s), 33 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表