`
javahigh1
  • 浏览: 1254318 次
  • 性别: 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++要求给一个一维数组输入任意6个整数,假设是7,4,8,9,1,5,然后按下列方阵打印

    方阵打印通常涉及到二维数组,但在这里,我们可以使用两层嵌套循环来模拟这个过程,每层循环分别处理行和列。由于数组只有6个元素,我们可以将其分为两行三列或者三行两列来打印。假设我们选择两行三列的方式,代码...

    matlab三维数组引用

    在MATLAB中,三维数组是一个强大的工具,尤其在处理多维数据时,如图像处理、物理模拟、数据分析等领域。以下是对三维数组更详细的探讨。 首先,三维数组的定义和初始化是通过指定三个维度的大小来完成的。例如,`...

    螺旋式遍历二维数组(矩阵)Demo

    首先,我们需要创建一个二维数组来模拟矩阵。这个数组可以是任意大小,例如一个3x3的矩阵: ``` [ [1, 2, 3], [4, 5, 6], [7, 8, 9] ] ``` 接下来,我们将设计一个算法来实现螺旋遍历。以下是一个简单的Java...

    Vector创建二维数组.zip

    这种结构可以轻松模拟二维数组的行为,同时提供了更多的灵活性。 下面是一个简单的例子,展示了如何使用`std::vector`创建二维数组: ```cpp #include #include int main() { std::vector&lt;std::vector&lt;int&gt;&gt; ...

    matlab 三维 数组 结构数组-创建结构数组 算法开发、数据可视化、数据分析以及数值计算 Matlab课程 教程 进阶 资源

    在算法开发中,三维数组常用于存储和处理多维数据,如图像处理中的像素数据,而结构数组则适合管理具有多种属性的对象,如在模拟系统中存储不同类型的实体信息。数据分析时,两者结合使用可以实现更高效的数据组织和...

    JavaScript动态创建二维数组的方法示例

    这实现了二维数组的效果,你可以通过`arr[i][j]`访问任意位置的元素。 另一种创建二维数组的方法是使用嵌套的循环,同时初始化数组元素的值: ```javascript var arr = []; var n = 1; for (var i = 0; i ; i++) {...

    javascript 二维数组的实现与应用

    在 JavaScript 中虽然没有直接提供二维数组的内置数据结构,但可以通过多层嵌套数组的方式来模拟实现二维数组的功能。通常情况下,二维数组可以看作是一个数组的数组,每一行是一个数组,这样就可以在行和列上存储和...

    Python中创建二维数组

    因此,可以使用嵌套的列表来创建和模拟二维数组的操作。 3. Python中创建二维数组的常规方法: 由于Python不直接支持二维数组的定义,因此通常采用列表解析(list comprehension)的方式,这是一种非常高效且直观...

    MATLAB 创建的三维数组插值软件说明.docx

    在三维空间中,如果有一个由(X, Y, Z)坐标定义的数据集,我们可以通过插值算法预测任意坐标(x1, y1)处的Z值。这种方法在模拟、图像处理、物理模拟等领域都有广泛应用。 MATLAB中的插值函数包括多种方法,如线性插值...

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

    本主题将深入探讨如何使用二维数组来模拟一个矩形迷宫,并利用随机深度优先搜索(DFS)、随机广度优先搜索(BFS)以及随机普里姆算法(Prim's Algorithm)生成无回路的迷宫,同时解决从迷宫中的任意两点找到正确路径...

    数据结构多维数组课程设计

    - **目的:** 定义并模拟实现一种整型多维数组类型。 - **特点:** 支持任意整数开始的连续整数作为下标。 - **功能要求:** - 定义整型多维数组类型(以3维为例)。 - 下标变量赋值,并进行下标范围检查。 - 同...

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

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

    计算导论与程序设计:chap6一维数组.pptx

    通过数组名和下标,我们可以访问和操作数组中的任意元素。 在C语言中,声明数组涉及到指定数组名称以及元素的数量。例如,如果我们要声明一个能存储10个整数的数组,可以写作`int numbers[10];`。声明数组的同时也...

    C++——数组模拟链表

    "C++数组模拟链表" C++中的链表是数据结构中非常重要的一部分,而在链表中,我们可以使用数组来模拟链表的结构。今天,我们将讨论如何使用数组来模拟链表,并实现链表的插入和遍历操作。 首先,我们需要了解链表的...

    C++的数组转换成矩阵

    本示例展示了如何使用C++实现将两个二维数组(模拟矩阵)进行相乘并存储到另一个二维数组的操作。具体步骤如下: 1. **定义数组**: - 定义了三个整型数组:`a[2][3]`、`b[3][2]` 和 `c[2][2]`。 - 数组 `a` 和 `...

    12课程介绍15.zip

    在MATLAB中,数组可以有任意数量的维度,而三维数组是最常见的多维数组之一,它由三个索引来确定每个元素的位置,通常表示为三维空间中的矩阵。例如,你可以用它来存储图像数据,其中每个元素代表像素,三个维度分别...

    数组解决乘积超出数据范围

    具体来说,可以通过一个数组来模拟大整数的存储和计算过程。每个数组元素代表大整数的一位或者几位数字,通过这种方式可以有效地避免数值溢出,并且能够处理任意大小的整数运算。 ### 三、关键步骤详解 #### 3.1 ...

    向数组中插入元素

    在编程领域,数组是一种基本的数据结构...在Visual C++中,可以利用标准库的容器类如`std::vector`实现高效插入,或者在固定大小的数组中通过创建新数组来模拟插入。理解和熟练掌握这些技巧对于提升编程效率至关重要。

    C++螺旋数组

    这个C++程序可以扩展到任意大小的二维数组,只要相应地调整参数即可。同时,此方法也适用于逆时针方向的螺旋数组填充,只需在处理四个方向时调整顺序即可。这种螺旋数组的实现方式是基于边界调整和循环控制,易于...

    分子模拟中的最大子数组计算.pptx

    分子模拟中的最大子数组计算 ### 一、最大子数组问题定义 #### 1.1 最大子数组问题概述 最大子数组问题是指在给定的一维数组中找到和最大的连续子数组。这里的“连续”指的是数组中的一个片段或部分,包含连续的...

Global site tag (gtag.js) - Google Analytics