模拟任意维数组的类
来源:互联网 发布:即时聊天交友软件 编辑:程序博客网 时间: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;
}
- 模拟任意维数组的类
- 任意数组的输入
- HDU 5522 Numbers(模拟,问数组中是否存在任意2个数字的和在数组中)
- 用C++的模板类定义一个万能数组,数组元素类型任意,数组大小也任意
- 实现的任意下标开始的数组类
- Java一维数组操作类,可以加入任意类型的数据
- 模板实现任意维数组
- PHP二维数组(或任意维数组)转换成一维数组的方法汇总
- 2个任意维度的数组元素交叉显示在一维数组的实现算法
- java编程!---实现任意数组的倒叙
- 求数组中任意个数的组合
- JAVA创建任意类型的数组
- 创建处理任意二维数组的函数
- 交换数组的任意2个元素
- Swift中关于任意类型的数组
- 利用委托求任意数组的最大值
- 字符数组与任意数字的转化
- 模拟重写数组类
- 这就是俺们的学校,跟火星差不多
- Joan Baez - Willie Moore
- Jakarta Struts应用框架介绍
- 设置表格奇偶行不同颜色,鼠标划过变色的javascript代码
- 追MM与设计模式(java的32种设计模式)
- 模拟任意维数组的类
- dsfadf
- Java 中的 ClassPath 和 Package
- 庆祝
- test
- 堕落、苦难、博爱与正义:因父之名(作者:苏友瑞)
- 为什么sun的JDK不提供更新zip文件内容的方法?
- 程序员的爱情(C#版)
- 茶饭小贴·采花贼的下场(转)