C/C++数组实现

概述

数组是定义线性表在维数上得到扩展,即线性表的元素又是一个线性表。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;
}

测试结果

C/C++数组实现

示例下载

 

 

 

给TA打赏
共{{data.count}}人
人已打赏
开发

C++面向对象知识总结|类&对象&成员&修饰

2023-9-15 17:15:02

开发

lua系统学习03-变量类型

2023-9-15 17:38:05

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索