c++实现的Array数据结构

1.Array.h,Array<T>的定义

template <class T>
class Array
{
protected:
    T *data;    //一个指向数组数据的指针
    unsigned int base;    //base为数组的起始下表
    unsigned int length;    //length为数组的长度
public:
    Array();    //缺省的构造函数
    Array(unsigned int, unsigned int = 0);    //数组构造函数
    ~Array();    //析构函数

    Array(Array const&);    //拷贝构造函数
    Array& operator = (Array const&);    //重载等号操作符,用于一个数组给另外一个数组赋值

    T const& operator [] (unsigned int) const;    //重载中括号操作符,返回一个T数值常量,返回值不能被改变,在函数末尾加const表示this指针指向const
    T& operator [] (unsigned int);    //重载中括号操作符,返回一个T数值常量,其返回值可以被改变

    T* Data() const;    //返回数组数据的指针data
    unsigned int Base() const;    //返回成员base
    unsigned int Length() const;    //返回成员length

    void SetBase(unsigned int);    //设置成员变量base的数值
    void SetLength(unsigned int);    //设置成员变量length的数值
};

//动态数组所占空间S(n)=sizeof(T*)+2sizeof(unsigned int)+nsizeof(T),假定T类型所占用空间为一个常数,故S(n)=O(n)

 

2.Array<T>中成员函数的实现

#include "Array.h"

template <class T>
Array<T>::Array() :
    data(new T[10]), 
    base(0),
    length(0)
{}
//缺省的构造函数不含变量,只需要给对象的变量一个初始值,时间复杂度O(1)

template <class T>
Array<T>::Array(unsigned int n, unsigned int m) :
    data(new T[n]),
    base(m), 
    length(n)
{}
//初始化数组,n为数组的长度,时间复杂度常量O(1)

template <class T>
Array<T>::Array(Array<T> const& array) :
    data(new T[array.length]),
    base(array.base),
    length(array.length)
{
    for (unsigned int i = 0; i < length; ++i)
        data[i] = array.data[i];
}

//备份构造函数,将一个数组从赋值到另外一个数组,时间复杂度为O(n)

template <class T>
Array<T>::~Array()
{
    delete[] data;
}

//析构函数,删除数组所占用的内存空间

template <class T>
T* Array<T>::Data() const
{
    return data;
}

template <class T>
unsigned int Array<T>::Base() const
{
    return base;
}

template <class T>
unsigned int Array<T>::Length() const
{
    return length;
}

//这三个为存取器函数,用来返回成员,时间复杂度都为O(1)

template <class T>
T const& Array<T>::operator[] (unsigned int position) const
{
    unsigned int const offset = position - base;
    if (offset >= length)
        throw out_of_range("invalid position");
    return data[offset];
}

template <class T>
T& Array<T>::operator[] (unsigned int position)
{
    unsigned int const offset = position - base;
    if (offset >= length)
        throw out_of_range("invalid position");
    return data[offset];
}
//这两个都为取下表操作符的重载,区别是第一个返回值不可以作为左值,第二个返回值可以作为左值,时间复杂度都为O(1)

template <class T>
void Array<T>::SetBase(unsigned int newBase)
{
    base = newBase;
}

template <class T>
void Array<T>::SetLength(unsigned int newLength)
{
    T* const newData = new T[newLength];
    unsigned int const min = length < newLength ? length : newLength;
    for (unsigned int i = 0; i < min; ++i)
        newData[i] = data[i];
    delete[] data;
    data = newData;
    length = newLength;
}

//这两个函数来重设对象的成员,时间复杂度为T(m,n)=min(m,n)*T(T::T(T&))+O(1)

template <class T>
Array<T>& Array<T>::operator = (Array<T> const& array)
{
    if (this != &array)
    {
        delete[] data;
        base = array.base;
        length = array.length;
        data = new T[length];
        for (unsigned int i = 0; i < length; ++i)
            data[i] = array.data[i];
    }
    return this;
}

//重载赋值操作符,时间复杂度为O(n)

 

3.测试主函数main.cpp

#include "Array.cpp"
#include <iostream>
using namespace std;

template <class T> void Output(Array<T> array);

template <class T>
void Output(Array<T> array)
{
    cout << "data:";
    for (unsigned int i = array.Base(); i < array.Length(); i++)
    {
        cout << array.Data()[i] << " ";
    }
    cout << endl;
    cout << "length:" << array.Length()<<endl;
    cout << "base:" << array.Base() <<endl;
}

int main()
{
    cout << "Array()正在执行。。。" << endl;
    Array<int> array0 = Array<int>();
    Output(array0);
    cout << "Array(unsigned int, unsigned int = 0)正在执行。。。" << endl;
    Array<int> array1 = Array<int>(10);
    Output(array1);
    cout << "Array(Array const&)正在执行。。。" << endl;
    Array<int> array2(array1);
    Output(array2);
    cout << "~Array()正在执行。。。" << endl;
    array2.~Array();
    Output(array2);
    cout << "T const* Data() const,unsigned int Base() const,unsigned int Length() const,"
        << "T const& operator [] (unsigned int) const在Output函数中执行。。。" << endl;
    cout << "T& operator [] (unsigned int)正在执行。。。" << endl;
    Array<int> array3(10);
    for (unsigned int i = array1.Base(); i < array1.Length() - array1.Base(); i++)
    {
        array3.Data()[i] = i;
    }
    Output(array3);
    cout << "void SetBase(unsigned int)正在执行。。。" << endl;
    array3.SetBase(2);
    Output(array3);
    cout << "void SetLength(unsigned int)正在执行。。。" << endl;
    array3.SetLength(7);
    Output(array3);
    getchar();
    return 0;
}

 

4.测试结果

 

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。