我们专注攀枝花网站设计 攀枝花网站制作 攀枝花网站建设
成都网站建设公司服务热线:400-028-6601

网站建设知识

十年网站开发经验 + 多家企业客户 + 靠谱的建站团队

量身定制 + 运营维护+专业推广+无忧售后,网站问题一站解决

数据结构(04)_数组类的实现

C++中支持原生数组,但由于原生数组的天然缺陷(不能获取长度信息、越界访问不会报错...),我们有必要来开发自己的数组类,从而解决这些问题。
数组类的继承关系如图:
数据结构(04)_数组类的实现

创新互联公司是专业的德安网站建设公司,德安接单;提供成都网站设计、网站制作,网页设计,网站设计,建网站,PHP网站建设等专业做网站服务;采用PHP框架,可快速的进行德安网站开发网页制作和功能扩展;专业做搜索引擎喜爱的网站,专业的做网站团队,希望更多企业前来合作!

1.数组类的实现_1

1.1.抽象类模板Array

需求分析:
1、由于线性表,不能作为数组直接使用,我们需要自己实现一个数组类来代替原生数组。
2、解决原生数组越界访问不会报错的问题
3、提供数组的长度信息

1.2.Array设计要点:

  • 抽象类模本,存储空间的位置和大小由子类指定。
  • 重载数组操作符,并判断访问下标是否越界(合法)
  • 提供数组长度信息的抽象访问函数
  • 提供数组对象间的复制操作(通过重载拷贝构造函数和赋值操作符完成)
    template < typename T >
    class Array : public Object
    {
    protected:
    T *m_array;
    public:
    T& operator [] (int index)
    T operator [] (int index) const
    bool get(int index, const T& e)
    bool set(int index, const T& e)
    virtual int length(void) = 0;
    };

    1.3. Array的实现

template < typename T >
class Array : public Object
{
protected:
    T *m_array;
public:
    T& operator [] (int index)
    {
        if( (index>=0) && (index&>(*this)[index];
    }

    bool get(int index, const T& e)
    {
        bool ret = (index>=0) && (index=0) && (index

1.4.StaticArray设计要点

设计要点:

  • 封装原生数组;
  • 使用模板参数决定数组大小
  • 实现函数返回数组长度
  • 拷贝构造和赋值重载
    template < typename T, int N >
    class StaticArray : public Array   
    protected:
    T m_space[N];
    public:
    StaticArray()
    // 提供拷贝构造喊赋值重载函数,实现数组的拷贝
    StaticArray(const StaticArray& obj)
    T& operator = (const StaticArray& obj)
    int length(void)
    };

    1.5. StaticArray的实现

template 
class StaticArray : public Array
{
protected:
    T m_space[N];
public:
    StaticArray()
    {
        this->m_array = m_space;
    }

    StaticArray(const StaticArray& obj)
    {
        this->m_array = m_space;

        for(int i=0; i& obj)
    {
        if(this != &obj)
        {
            this->m_array = m_space;

            for(int i=0; i

2.数组类的实现_2

2.1.DynamicArray设计要点

设计要点:类模板

  • 动态确定内部数组空间的大小
  • 实现函数返回数组的长度
  • 拷贝构造和赋值操作
    template < typename T >
    class DynamicArray : public Array
    {
    protected:
    int m_length;
    public:
    DynamicArray(int length)
    DynamicArray(const DynamicArray& obj)
    DynamicArray& operator = (const DynamicArray& obj)
    void resize(int length)
    ~DynamicArray()
    };

    2.2.DynamicArray代码优化

    DynamicArray类中的函数实现存在重复的逻辑,可以进行代码优化。
    重复代码逻辑的抽象:
    — init 函数中实现对象构造时的初始化操作
    — copy 函数负责从堆空间中申请内存,并执行拷贝构造操作
    — updata 将指定的堆空间作为内部存储数组使用

    2.3. DynamicArray实现

template 
class DynamicList : public SeqList
{

protected:
    int m_capacity;
public:
    DynamicList(int capacity)
    {
        this->m_array = new T[capacity];
        if(this->m_array != NULL)
        {
            this->m_length = 0;
            this->m_capacity = capacity;
        }
        else
        {
            THROW_EXCEPTION(NoEnoughMemoryException,"No memory to create DynamicList object ...");
        }
    }

    int capacity()const
    {
        return m_capacity;
    }

    void resize(int capacity)
    {
        if(capacity != m_capacity)
        {
            T* array = new T[capacity];
            if(array != NULL)
            {
                int length = (this->m_length < capacity ? this->m_length : capacity);
                for(int i=0;im_array[i];
                }

                T* temp = this->m_array;
                this->m_array = array;
                this->m_length = length;
                this->m_capacity = capacity;
                delete[] temp;
            }
            else
            {
                THROW_EXCEPTION(NoEnoughMemoryException,"No memory to create DynamicList object ...");
            }
        }
    }

    ~DynamicList()
    {
        delete[] this->m_array;
    }
};

总结:

  • StaticArray通过封装原生数组的方式,实现数组类
  • DynamicArray动态申请堆空间,使得数组长度动态可变
  • 数组对象能够代替原生数组,并且使用上更安全
  • 代码优化时项目开发必不可少的环节

网站题目:数据结构(04)_数组类的实现
URL分享:http://shouzuofang.com/article/jjgcse.html