概述
数组是定义线性表在维数上得到扩展,即线性表的元素又是一个线性表。n维数组是一种同构的数据结构,其每个数据元素类型相同、结构一致。
数组结构的特点如下
数组元素数目固定,一经初始化,其容量就不可再修改。
数据元素具有相同的类型,即元素同构。
数据元素的下标关系具有上下界的约束且下标有序。
数组的顺序存储
数组容量是不可变的。所以通常在大多数编程语言下,数组一般不做插入和删除操作,一旦定义了数组,则结构中的数据元素个数和元素之间的关系就不再发生变动。(前提是在逻辑中不对元素进行调换或覆盖操作。)
二维数组的存储结构可分为以行为主序和以列为主序的两种方法。
以行为主序存储的地址计算公式为:
Loc(a_i_j)=Loc(a_1_1)+((i-1)*n+(j-1))*L
若以下标[1,1]作为数组的起始位置,n为列长度。(i-1)*n表示前i行的数据元素个数,(j-1)表示当前行的第一个元素到目标J位置的差。L表示每个数组元素的字节大小。
实现
初始化
根据给定的列数与行数,计算所占的内存空间并初始化。
/// @brief 一维数组初始化
/// @tparam ElementType
/// @param arraySize
template<typename ElementType>
myarray<ElementType>::myarray(int arraySize)
{
Initialize(arraySize);
}
/// @brief 二维数组初始化
/// @tparam ElementType
/// @param row_len
/// @param col_len
template<typename ElementType>
myarray<ElementType>::myarray(int row_len,int col_len)
{
Initialize(col_len,row_len);
}
template<typename ElementType>
void myarray<ElementType>::Initialize(int col_len,int row_len)
{
this->col_len=col_len;
this->row_len=row_len;
//计算元素个数
length=col_len*row_len;
//开辟空间
space=(ElementType*)malloc(sizeof(ElementType)*length);
for (size_t i = 0; i < length; i++)
{
*(space+i)=0;
}
}
获取长度
根据给定的维度参数,获取对应维度的元素个数。
/// @brief
/// @tparam ElementType 数据类型
/// @param dimension 维度
/// @return 返回对应维度的元素个数
template<typename ElementType>
int myarray<ElementType>::getlength(int dimension)
{
if (dimension==0)
{
if (row_len==1)
{
return col_len;
}
return row_len;
}
else if(dimension==1)
{
if (row_len==1)
{
return 0;
}
return col_len;
}
}
获取元素
以行为主序,下标[0,0]为起始位置。通过给定的行列索引得到线性内存空间上的索引。
ElementType& get(int row,int col)
{
//通过row col 得到线性内存空间上的索引。
int index=(row*col_len+col);
return *(space+index);
}
ElementType& get(int index)
{
if (row_len>1)
{
cout<<"二维数组不能使用一维索引器访问"<<endl;
}
if (index>=length)
{
cout<<"索引超出数组范围"<<endl;
}
return *(space+index);
}
主程序入口
#include <stdlib.h>
#include <iostream>
using namespace std;
#include "myarray.h"
int main()
{
//one_dimensional
myarray<int> *array=new myarray<int>(2);
array->get(0)=1;
array->get(1)=2;
for (size_t i = 0; i < array->getlength(0); i++)
{
int& v =array->get(i);
cout<<v<<endl;
}
cout<<"Two_dimensional"<<endl;
//Two_dimensional
myarray<int> *Two_dimensional=new myarray<int>(2,4);
Two_dimensional->get(0,0)=1;
Two_dimensional->get(0,1)=2;
Two_dimensional->get(1,0)=11;
Two_dimensional->get(1,1)=22;
for (size_t i = 0; i < Two_dimensional->getlength(0); i++)
{
for (size_t j = 0; j < Two_dimensional->getlength(1); j++)
{
int& v =Two_dimensional->get(i,j);
printf("%d/t",v);
}
printf("/n");
}
cout<<"Two_dimensional"<<endl;
for (size_t i = 0; i < Two_dimensional->getlength(0); i++)
{
Two_dimensional->get(i,2)=(i+1)*2;
Two_dimensional->get(i,3)=(i+1)*3;
printf("/n");
}
for (size_t i = 0; i < Two_dimensional->getlength(0); i++)
{
for (size_t j = 0; j < Two_dimensional->getlength(1); j++)
{
int& v =Two_dimensional->get(i,j);
printf("%d/t",v);
}
printf("/n");
}
system("pause");
return 0;
}
测试结果
示例下载