⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 xarray.h

📁 BCB的学习资料
💻 H
📖 第 1 页 / 共 3 页
字号:
//---------------------------------------------------------------------------

#ifndef XArrayH
#define XArrayH
#ifndef XExcepMsgH
#include <XExcepMsg.h>
#endif
namespace zdhsoft
{
//前置申明两个模板;
template<class T>class XArray;
template<class T>class XDynamicArray;
class XExceptionArrayOutOfRange;
//---------------------------------------------------------------------------
/*
///////////////////////////////////////////////////////////////////////////////
[Name]XArray<T>
[Title]静态数组模板
///////////////////////////////////////////////////////////////////////////////
[Description]
    这是一个静态数组类的模板,提供数组的基本功能。最主要的做用就是进行上下标检查。
并些避免显示的使用指针。对于内存的分配,采用的是缺省的new和delete方法
    所有方法已全部的测试
    关于const T & operator[](int Index)const;方法说明,由于一些模板,传的参数是const
    类型的,结果造成T & operator[](int Index)编译的时候提示错误,所以在这里又定了一个
    标识为const的operator[]方法。
[Version]1.0
[Author]Rex Winter
[Date]2005-4-21
[Test]
    2005-6-6 完成对XArray所有方法的测试
    除CodeGurad的指针算数越界之外,没有其它任何提示
    在模块定义中,指针只是计算出界,但并没有访问指向出界的数据
    
///////////////////////////////////////////////////////////////////////////////
*/
template<class T>
class XArray
{
public:
    XArray(int InitLength = 0);          //default constructor
    XArray(const XArray<T> & srcArray);    //default copy constructor
    XArray(const XDynamicArray<T> &srcArray); //以动态数为单位
    XArray(const T * srcData, int srcCount);  //动数据为单位
    ~XArray();

    T & operator[](int Index);
    const T & operator[](int Index) const;
    //assert
    XArray<T> & operator=(const XArray<T> & aOtherArray);
    const T * Data() const { return m_Data; }
    int GetLength()  const { return m_Length; }   

    void NewArray(const XArray<T> & srcArray,int srcIndex,int copySize); //根据指定的数组,调整自身这个数组
    static void CopyArray(const XArray<T> & srcArray,int srcIndex, XArray<T> & destArray, int destIndex, int copySize);//复制数组,从src复制到dest,

public:
    __property int Length = { read = m_Length };  //在BCB中,可以使用该性,在C++中最好不要使用。

private:
    T * m_Data;     //数组的指钟
    int m_Length;   //数组的长度
};

/*
///////////////////////////////////////////////////////////////////////////////
[Name]XDynamicArray<T>
[Title]动态数组模板
///////////////////////////////////////////////////////////////////////////////
[Description]

    这是一个动态数组模板,提供动态数组功能。主要有Insert,Delete,Append,Clear等操
作,同时又具有静态数组的功能。是静态数组的一个扩展.
    该数组是基于静态数组之上的
    2005-6-14新增PushBack,PopBack,<<,>>等方法
[Version]1.0
[Author]Rex Winter
[Date]2005-4-22
[Test]
    2005-6-14所有的方法均经过测试,
    除CodeGurad的指针算数越界之外,没有其它任何提示
    在模块定义中,指针只是计算出界,但并没有访问指向出界的数据
///////////////////////////////////////////////////////////////////////////////
*/
template<class T>
class XDynamicArray
{
public:
    XDynamicArray(int InitLength = 0,int iPrepareLength = 0);
    XDynamicArray(const XDynamicArray<T> & srcArray);
    XDynamicArray(const XArray<T> &srcArray,int iPrepareLength = 0);
    XDynamicArray(const T * data,int InitLength,int iPrepareLength = 0);
    ~XDynamicArray();
    static void CopyArray(const XDynamicArray<T> & srcArray,int srcIndex, XDynamicArray<T> & destArray, int destIndex, int copySize);

    const T * Data() const { return m_Data->Data(); }
    int  GetLength() const { return m_Length; }
    //确认最小容量
    void ensureCapacity(int minimumCapacity)
    {
        if (minimumCapacity > m_Data->GetLength() )
        {
            expandCapacity(minimumCapacity);
        }
    }
    //清除所有数组
    void Clear(bool bFree = false)
    {
        if(bFree)
        {
            delete m_Data;
            m_Data = new XArray<T>(16);
        }
        m_Length = 0;
    }
    //get array element function
    const T & operator[](int Index) const;
    T & operator[](int Index);
    //assert
    XDynamicArray<T> & operator=(const XDynamicArray<T> & aOtherArray);
    void Append(const T & data);

    void Append(const XArray<T> &dataArray);
    void Append(const XDynamicArray<T> & dataArray);
    void Append(const T * aData,int AppendCount);
    //在最后追加一个元素
    XDynamicArray<T> & operator<<(const T & data)
    {
        Append(data);
        return *this;
    }
    //在最后追加一组元素
    XDynamicArray<T> & operator<<(const XArray<T> &dataArray)
    {
        Append(dataArray);
        return *this;
    }
    //在最后追加一组元素
    XDynamicArray<T> & operator<<(const XDynamicArray<T> & dataArray)
    {
        Append(dataArray);
        return *this;
    }
    //在最后弹出一个元素
    XDynamicArray<T> & operator>>(T & data)
    {
        PopBack(data);
        return *this;
    }
    void PushBack(const T & data);
    bool PopBack();
    bool PopBack(T & data);
    bool IsEmpty() { return m_Length<1?true:false; }
    XDynamicArray<T> & Delete(int Index);
    XDynamicArray<T> & DeleteRange(int BeginIndex,int DeleteCount);
    XDynamicArray<T> & Insert(int Index,const T & data);
    void NewArray(const XDynamicArray<T> & srcArray,int sIndex, int copySize);
    void NewArray(const XArray<T> & srcArray,int sIndex, int copySize);
public: //属性
    __property int Length = { read = m_Length };
private:
    void expandCapacity(int minimumCapacity);
private:
    XArray<T> * m_Data;
    int m_Length;
};
//实现
/*
////////////////////////////////////////////////////////////////////////////////
[Name]XArray
[Title]XArray的构造函数。
////////////////////////////////////////////////////////////////////////////////
[param]
    <int default=0>InitLength    数组初始化时的大小
[Exception]
    EOutOfMemory  如果new出内存失败,则抛出EOutOfMemory异常
[Description]
    XArray的构造函数。
[Version]1.0
[Author]Rex Winter
[Date]2005-4-21
////////////////////////////////////////////////////////////////////////////////
*/
template<class T>
XArray<T>::XArray(int InitLength)
    :m_Data(NULL),m_Length(0)
{
    if( InitLength < 0 ) InitLength = 0;
    if( InitLength > 0 )
    {
        m_Data = new T[ InitLength ];
        if( m_Data == NULL ) throw EOutOfMemory(EXCEPTION_OUT_OF_MEMORY);
        else m_Length = InitLength;
    }
}
/*
////////////////////////////////////////////////////////////////////////////////
[Name]XArray
[Title]XArray的拷贝构造函数。
////////////////////////////////////////////////////////////////////////////////
[param]
    <const XArray<T> &>srcArray    目标数组
[Exception]
    EOutOfMemory  如果new出内存失败,则抛出EOutOfMemory异常
[Description]
    XArray的构造函数。为了避免编译器产生一个这样的构造函数
[Version]1.0
[Author]Rex Winter
[Date]2005-4-21
////////////////////////////////////////////////////////////////////////////////
*/
template<class T>
XArray<T>::XArray(const XArray<T> & srcArray)
    :m_Data(NULL),m_Length( srcArray.m_Length )
{
    int iLength = srcArray.m_Length;
    if( iLength > 0 )
    {
        m_Data = new T[ iLength ];
        if( m_Data == NULL ) throw EOutOfMemory(EXCEPTION_OUT_OF_MEMORY);
        m_Length = iLength;
        //copy Data
        const T * src = srcArray.Data();
        T * dest = m_Data;
        for(int Index = 0; Index < iLength; Index ++)
        {
            *dest = *src;
            dest++;
            src++;
        }
    }
}
/*
////////////////////////////////////////////////////////////////////////////////
[Name]XArray
[Title]XArray的构造函数。
////////////////////////////////////////////////////////////////////////////////
[param]
    <const XDynamicArray<T> &>srcArray    目标动态数组
[Exception]
    EOutOfMemory  如果new出内存失败,则抛出EOutOfMemory异常
[Description]
    根据动态数组初始数组
[Version]1.0
[Author]Rex Winter
[Date]2005-4-26
////////////////////////////////////////////////////////////////////////////////
*/
template<class T>
XArray<T>::XArray(const XDynamicArray<T> & srcArray)
    :m_Data(NULL),m_Length( 0 )
{
    int InitLength = srcArray.GetLength();
    if( InitLength > 0 )
    {
        m_Data = new T[ InitLength ];
        if( m_Data == NULL ) throw EOutOfMemory(EXCEPTION_OUT_OF_MEMORY);
        m_Length = InitLength;
        //copy Data;
        const T * src = srcArray.Data();
        T * dest = m_Data;
        for(int Index = 0; Index < InitLength; Index ++ )
        {
            *dest = *src;
            dest++;
            src++;
        }
    }
}
/*
////////////////////////////////////////////////////////////////////////////////
[Name]XArray
[Title]XArray的构造函数。
////////////////////////////////////////////////////////////////////////////////
[param]
    <const T *>srcData 将要初始化的数据
    <int>InitLength    初始化数据的个数
[Exception]
    EOutOfMemory  如果new出内存失败,则抛出EOutOfMemory异常
[Description]
    根据指定的数据,初始化数据
[Version]1.0
[Author]Rex Winter
[Date]2005-4-26
////////////////////////////////////////////////////////////////////////////////
*/
template<class T>
XArray<T>::XArray(const T * srcData, int InitLength)
    :m_Data(NULL),m_Length( 0 )
{
    if( InitLength > 0 )
    {
        m_Data = new T[ InitLength ];
        if( m_Data == NULL ) throw EOutOfMemory(EXCEPTION_OUT_OF_MEMORY);
        m_Length = InitLength;
        const T * src = srcData;
        T * dest = m_Data;
        for(int Index = 0; Index < InitLength; Index ++ )
        {
            *dest = * src;
            dest++;
            src++;
        }
    }
}

/*
////////////////////////////////////////////////////////////////////////////////
[Name]operator []
[Title]取得数组元素。
////////////////////////////////////////////////////////////////////////////////
[param]
    <int>Index    对应的数组的下标
[Return]
    <T&>返回数组元素的引用。
[Exception]
    XExceptionArrayOutOfRange  如果下标越界,则抛出XExceptionArrayOutOfRange异常
[Description]
    取得数组元素,并返回这个元素的引用。
[Version]1.0
[Author]Rex Winter
[Date]2005-4-21
////////////////////////////////////////////////////////////////////////////////
*/
template<class T>
T& XArray<T>::operator[](int Index)
{
    if( Index<0 || Index >= m_Length ) throw XExceptionArrayOutOfRange(Index, m_Length);
    return m_Data[Index];
}
/*
////////////////////////////////////////////////////////////////////////////////
[Name]operator []
[Title]取得数组元素。但反回的值是不可变的
////////////////////////////////////////////////////////////////////////////////
[param]
    <int>Index    对应的数组的下标
[Return]
    <const T&>返回数组元素的引用。
[Exception]
    XExceptionArrayOutOfRange  如果下标越界,则抛出XExceptionArrayOutOfRange异常
[Description]
    取得数组元素,并返回这个元素的引用。
[Version]1.0
[Author]Rex Winter
[Date]2005-4-21
////////////////////////////////////////////////////////////////////////////////
*/
template<class T>
const T& XArray<T>::operator[](int Index) const
{
    if( Index<0 || Index >= m_Length ) throw XExceptionArrayOutOfRange(Index, m_Length);
    return m_Data[Index];
}
/*
////////////////////////////////////////////////////////////////////////////////
[Name]operator =
[Title]重设数组,使其与目的数组一样。
////////////////////////////////////////////////////////////////////////////////
[param]
    <const XArray<T> &>aOtherArray    目的数组对象
[Return]
    <XArray<T> &>返回当前对象的引用。
[Exception]
    EOutOfMemory  如果内存失败,则抛出OutOfMemory异常
[Description]
    给数组赋新值,如果数据源为自已,则不进行重新复制
    如果重新申请内存失败,则抛出异常,抛出异常EOutOfMemory
    如果数据源的大小<=Length(),则不进行重新申请内存
[Version]1.0
[Author]Rex Winter
[Date]2005-4-21
////////////////////////////////////////////////////////////////////////////////
*/
template<class T>
XArray<T> & XArray<T>::operator = (const XArray<T> & aOtherArray)
{
    if( this == &aOtherArray) return *this; //如果数据源就是本身,则不进行重新复制
    if( m_Length < aOtherArray.m_Length )
    {
        if(m_Data != NULL) delete[] m_Data;
        m_Data = new T[aOtherArray.m_Length];
        if(m_Data == NULL) throw EOutOfMemory(EXCEPTION_OUT_OF_MEMORY);
    }
    //copy data
    m_Length = aOtherArray.m_Length;
    const T * src = aOtherArray.m_Data;
    T * dest = m_Data;
    for(int iCount=0; iCount<m_Length; iCount++)
    {
        *dest = *src;
        dest++;
        src++;
    }
    return * this;
}

/*
////////////////////////////////////////////////////////////////////////////////
[Name]~XArray
[Title]XArray的析构函数。
////////////////////////////////////////////////////////////////////////////////
[Description]
    XArray的析构函数。
    释放申请的内存,并将数组长度设为0
[Version]1.0
[Author]Rex Winter
[Date]2005-4-21
////////////////////////////////////////////////////////////////////////////////
*/
template<class T>
XArray<T>::~XArray()

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -