`
javahigh1
  • 浏览: 1226389 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

模拟任意维数组的类

 
阅读更多

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

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

分享到:
评论

相关推荐

    以二维数组模拟一个矩形迷宫,利用随机深度优先、随机广度优先或随机普里姆算法生成不含有回路的迷宫并找到迷宫中任意两点的正确路径

    以二维数组模拟一个矩形迷宫,利用随机深度优先、随机广度优先或随机普里姆算法生成不含有回路的迷宫并找到迷宫中任意两点的正确路径。

    C程序实例大全,学习C语言的好帮手

    014 求解二维数组的最大/最小元素 015 利用数组求前n个质数 016 编制万年历 017 对数组元素排序 018 任意进制数的转换 019 判断回文数 020 求数组前n元素之和 021 求解钢材切割的最佳订单 022 通过指

    C++——数组模拟链表

    C++数据结构——链表,适合初学者,使用数组模拟链表。

    C++程序设计综合练习题-程序设计题.doc

    假设已定义了—个模拟数字式时钟的类clock,请编写模拟时间动作和模拟时间显示的成 员。 5. 编程求1-----100之间的所有素数。 6. 从键盘输入任意多个整数(-999为结束标志),计算其中正数之和。 7. 利用函数将一维...

    经典C程序源代码文件(220个).zip

    012 用一维数组统计学生成绩 013 用二维数组实现矩阵转置 014 求解二维数组的最大/最小元素 015 利用数组求前n个质数 016 编制万年历 017 对数组元素排序 018 任意进制数的转换 019 判断回文数 020 求数组前n元素之...

    JavaScript模拟数组合并concat

    可以是任意多个。 返回值 返回一个新的数组。该数组是通过把所有 arrayX 参数添加到 arrayObject 中生成的。如果要进行 concat() 操作的参数是数组,那么添加的是数组中的元素,而不是数组 。 我们有两个这样的...

    200个经典C程序源码小游戏

    012 用一维数组统计学生成绩 013 用二维数组实现矩阵转置 014 求解二维数组的最大/最小元素 015 利用数组求前n个质数 016 编制万年历 017 对数组元素排序 018 任意进制数的转换 019 判断回文数 020 求数组前...

    220个经典C语言源码

    012 用一维数组统计学生成绩 013 用二维数组实现矩阵转置 014 求解二维数组的最大/最小元素 015 利用数组求前n个质数 016 编制万年历 017 对数组元素排序 018 任意进制数的转换 019 判断回文数 020 求数组前...

    c语言实例解析(基础篇)1~41

    012 用一维数组统计学生成绩 013 用二维数组实现矩阵转置 014 求解二维数组的最大/最小元素 015 利用数组求前n个质数 016 编制万年历 017 对数组元素排序 018 任意进制数的转换 019 判断回文数 020 求数组前...

    220个C语言经典代码

    012 用一维数组统计学生成绩 013 用二维数组实现矩阵转置 014 求解二维数组的最大/最小元素 015 利用数组求前n个质数 016 编制万年历 017 对数组元素排序 018 任意进制数的转换 019 判断回文数 020 求数组前...

    java数据结构课程设计——简易GPS导航(最优路径)源码+文档

    主要实现查找任意两地点间最短路径并获得其长度,添加地点,删除地点,添加路线,删除路线操作 该系统带有模拟地图的加权无向图,直观的表现... 数据结构: 二维数组存储加权无向图 ArrayList存储地点,路径的相关信息

    C#模拟扑克牌发牌算法

    54张牌要区分花色:黑桃、梅花、方块、红桃)并且存放在一个一维数组中。然后随机的发牌给三个玩家,其中任意一人为地主,地主比其他玩家多三张牌。

    C++数据结构 查找和排序的实验

    4.设计一个程序,任意给出n个学生信息(包括:学号,姓名,成绩等),实现按照分数高低打印出学生的考试名次、学号、姓名和成绩,同一名次的学生按照学号有小到大排序,并能根据选号查看任意学生信息。

    c语言实例解析(第二版)高清pdf电子书

    实例10 猜数字游戏 实例11 模拟ATM(自动柜员机)界面 实例12 用一维数组统计学生成绩 实例13 用二维数组实现矩阵转置 实例14 求解二维数组的最大/最小元素 实例15 利用数组求前n个质数 实例16 编制...

    javabiginteger源码-mock:java版的可以模拟任意数据的工具

    公司技术架构为前后台分类开发,在后端接口没有完成时需要返回模拟数据,测试时也需要模拟数据,于是需要一个可以模拟任意数据的工具,企业开发种从头写自己实现是不现实的,太浪费时间,于是github找了一个适合的...

    动态数组-模仿vector

    模拟vector所写的线性表...通过模板类,可以保存任意类型数据。需要数据类型具有赋值运算符和默认构造函数以及比较运算符。线性表提供向末尾添加,向表中插入,删除等接口函数。重载了下标运算符,赋值已经比较运算符等

    生命游戏模拟程序

    本程序试图用星号代表死细胞,空格代表活细胞,模拟任意初始条件下的生命游戏的发展过程,附件包含编译后的exe及cpp文件供大家参考 程序默认模拟20*20个方格内的细胞,可以通过在源代码中修改数组的下标上界得到...

Global site tag (gtag.js) - Google Analytics