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

📄 xarray.h

📁 BCB的学习资料
💻 H
📖 第 1 页 / 共 3 页
字号:
template<class T>
const T & XDynamicArray<T>::operator[](int Index) const
{
    if( Index<0 || Index >= m_Length ) throw XExceptionArrayOutOfRange(Index, m_Length);
    return m_Data->operator[](Index);
}
/*
////////////////////////////////////////////////////////////////////////////////
[Name]operator =
[Title]重设数组,使其与目的数组一样。
////////////////////////////////////////////////////////////////////////////////
[param]
    <const XDynamicArray<T> &>data    目的数组对象
[Return]
    <XDynamicArray<T> &>返回当前对象的引用。
[Exception]
    EOutOfMemory  如果内存失败,则抛出EOutOfMemory异常
[Description]
    给数组赋新值,如果数据源为自已,则不进行重新复制
    如果重新申请内存失败,则抛出异常,抛出异常EOutOfMemory
    如果数据源的大小<=Length(),则不进行重新申请内存
[Version]1.0
[Author]Rex Winter
[Date]2005-4-26
////////////////////////////////////////////////////////////////////////////////
*/
template<class T>
XDynamicArray<T> & XDynamicArray<T>::operator = (const XDynamicArray<T> & data)
{
    if(this == &data) return * this;
    if( data.m_Length > m_Data->GetLength() )
    {
        delete m_Data;
        m_Data = new XArray<T>( *data.m_Data );
        if( m_Data == NULL ) throw EOutOfMemory(EXCEPTION_OUT_OF_MEMORY);
    }
    else
    {
        XArray<T>::CopyArray( *data.m_Data, 0, *m_Data, 0, data.m_Length);
    }
    m_Length = data.m_Length;
    return *this;
}

/*
////////////////////////////////////////////////////////////////////////////////
[Name]Append
[Title]在数组的最后追加一个元素
////////////////////////////////////////////////////////////////////////////////
[param]
    <const T &>data          被追加的元素值
[Description]
    在数组的最后追加一个元素,与该类中的PushBack方法同样做用
[Version]1.0
[Author]Rex Winter
[Date]2005-4-26
////////////////////////////////////////////////////////////////////////////////
*/
template<class T>
void XDynamicArray<T>::Append(const T & data)
{
    ensureCapacity( m_Length+1 );
    m_Data->operator[]( m_Length++ ) = data;
}
/*
////////////////////////////////////////////////////////////////////////////////
[Name]Append
[Title]在数组的最后追加一个静态数组的元素
////////////////////////////////////////////////////////////////////////////////
[param]
    <const XArray<T> &>dataArray          被追加的静态数组
[Description]
    在数组的最后追加一个静态数组的元素
[Version]1.0
[Author]Rex Winter
[Date]2005-6-14
////////////////////////////////////////////////////////////////////////////////
*/

template<class T>
void XDynamicArray<T>::Append(const XArray<T> &dataArray)
{
    int DataLength = dataArray.GetLength();
    if( DataLength > 0 )
    {
        ensureCapacity( m_Length + DataLength );
        for(int Index=0; Index<DataLength; Index ++)
        {
            m_Data->operator[]( m_Length++ ) = dataArray[Index];
        }
    }
}
/*
////////////////////////////////////////////////////////////////////////////////
[Name]Append
[Title]在数组的最后追加一个动态数组的元素
////////////////////////////////////////////////////////////////////////////////
[param]
    <const XDynamicArray<T> &>dataArray          被追加的动态数组
[Description]
    在数组的最后追加一个动态数组的元素
[Version]1.0
[Author]Rex Winter
[Date]2005-6-14
////////////////////////////////////////////////////////////////////////////////
*/
template<class T>
void XDynamicArray<T>::Append(const XDynamicArray<T> & dataArray)
{
    int DataLength = dataArray.GetLength();
    if( DataLength > 0 )
    {
        ensureCapacity( m_Length + DataLength );
        for(int Index=0; Index<DataLength; Index ++)
        {
            m_Data->operator[]( m_Length++ ) = dataArray[Index];
        }
    }
}
/*
////////////////////////////////////////////////////////////////////////////////
[Name]Append
[Title]在数组的最后追加一组元素
////////////////////////////////////////////////////////////////////////////////
[param]
    <const T *>aData          被追加的一组元素的开始指针
    <int>AppendCount          被追加的元素个数
[Description]
    在数组的最后追加一组元素
[Version]1.0
[Author]Rex Winter
[Date]2005-6-14
////////////////////////////////////////////////////////////////////////////////
*/

template<class T>
void XDynamicArray<T>::Append(const T * aData,int AppendCount)
{
    if( AppendCount > 0 )
    {
        ensureCapacity( m_Length + AppendCount );
        for(int I=0; I < AppendCount; I ++)
        {
            m_Data->operator[]( m_Length++ ) = *aData++;
        }
    }
}

/*
////////////////////////////////////////////////////////////////////////////////
[Name]PushBack
[Title]在数组的最后压入一个元素
////////////////////////////////////////////////////////////////////////////////
[param]
    <const T &>data          被追加的元素值
[Description]
    在数组的最后压入一个元素,与该类中的Append的作用一样
[Version]1.0
[Author]Rex Winter
[Date]2005-4-26
////////////////////////////////////////////////////////////////////////////////
*/
template<class T>
void XDynamicArray<T>::PushBack(const T & data)
{
    ensureCapacity(m_Length+1);
    m_Data->operator[]( m_Length++ ) = data;
}
/*
////////////////////////////////////////////////////////////////////////////////
[Name]PopBack
[Title]从数组最后弹出一个数组元素
////////////////////////////////////////////////////////////////////////////////
[param]
[return]
    <bool>如果已弹出了一个数组元素,就返回true,否则返回false 
[Description]
    从数组最后弹出一个数组元素,与PushBack功能相反
[Version]1.0
[Author]Rex Winter
[Date]2005-4-26
////////////////////////////////////////////////////////////////////////////////
*/
template<class T>
bool XDynamicArray<T>::PopBack()
{
    if( m_Length > 0 )
    {
        m_Length--;
        return true;
    }
    else
    {
        return false;
    }
}
/*
////////////////////////////////////////////////////////////////////////////////
[Name]PopBack
[Title]从数组最后弹出一个数组元素
////////////////////////////////////////////////////////////////////////////////
[param]
    <T &> data 将要设值的对象
[return]
    <bool>如果已弹出了一个数组元素,就返回true,否则返回false 
[Description]
    从数组最后弹出一个数组元素,并将该元素的设到参数data中,与PushBack功能相反
[Version]1.0
[Author]Rex Winter
[Date]2005-4-26
////////////////////////////////////////////////////////////////////////////////
*/
template<class T>
bool XDynamicArray<T>::PopBack(T & data)
{
    if( m_Length > 0 )
    {
        m_Length--;
        data = m_Data->operator[](m_Length);
        return true;
    }
    else
    {
        return false;
    }
}
/*
////////////////////////////////////////////////////////////////////////////////
[Name]Delete
[Title]从数组删除一个数组元素
////////////////////////////////////////////////////////////////////////////////
[param]
    <int> Index 要删除的元素下标
[Exception]
    XExceptionArrayOutOfRang 如果被删除的下标越界,则抛出异常
[return]
    <XDynamicArray<T> &>返回当前对象的引用
[Description]
    删除指定下标元素的数组元素
[Version]1.0
[Author]Rex Winter
[Date]2005-4-26
////////////////////////////////////////////////////////////////////////////////
*/
template<class T>
XDynamicArray<T> & XDynamicArray<T>::Delete(int Index)
{
    //if out of range
    if( (Index < 0) || (Index >= m_Length) ) throw XExceptionArrayOutOfRange(Index, m_Length);
    //int iLastIndex = m_length - 1;
    XArray<T>::CopyArray( *m_Data,Index+1,*m_Data,Index,m_Length - Index - 1 );
    m_Length--;
    return * this;
}
/*
////////////////////////////////////////////////////////////////////////////////
[Name]DeleteRange
[Title]从数组删除指定范围的数组元素
////////////////////////////////////////////////////////////////////////////////
[param]
    <int> BeginIndex  开始删除的元素下标
    <int> DeleteCount 要删除的元素个数
[Exception]
    XExceptionArrayOutOfRang 如果被删除的下标越界,则抛出异常
[return]
    <XDynamicArray<T> &>返回当前对象的引用
[Description]
    删除指定下标元素的一组数组元素
[Version]1.0
[Author]Rex Winter
[Date]2005-4-26
////////////////////////////////////////////////////////////////////////////////
*/
template<class T>
XDynamicArray<T> & XDynamicArray<T>::DeleteRange(int BeginIndex,int DeleteCount)
{
    if( DeleteCount <=0 ) return *this;
    if( (BeginIndex < 0) || (BeginIndex >= m_Length) ) throw XExceptionArrayOutOfRange(BeginIndex, m_Length);
    int NextIndex = BeginIndex + DeleteCount;
    if( NextIndex >= m_Length )
    {
        m_Length = BeginIndex; //如果刚好删除的是后面几个,那个就不用移动了
    }
    else
    {
        XArray<T>::CopyArray(*m_Data, NextIndex, *m_Data, BeginIndex, m_Length - NextIndex);
        m_Length -= DeleteCount;
    }
    return * this;
}
/*
////////////////////////////////////////////////////////////////////////////////
[Name]Insert
[Title]在指定位置插入一个数组元素。
////////////////////////////////////////////////////////////////////////////////
[param]
    <int>Index                将被插入的下标
    <const T &>data           将被插入的数据
[Description]
    插入一个数组元素到指定位置,如果指定下标小于零,则会插入在下标为零的位置
    如果指定的下标大于最大下标,则会在插入在数组的最后。
    插入后,该下标及下标后面的元素,全部后移一位。
[Version]1.0
[Author]Rex Winter
[Date]2005-4-26
////////////////////////////////////////////////////////////////////////////////
*/
template<class T>
XDynamicArray<T> & XDynamicArray<T>::Insert(int Index,const T & data)
{
    if( Index < 0 ) Index = 0;
    if( Index >= m_Length )
    {
        Append( data );
    }
    else
    {
        ensureCapacity(m_Length+1);
        XArray<T>::CopyArray( *m_Data, Index, *m_Data, Index+1,m_Length - Index);
        (*m_Data)[Index]=data;
        m_Length++;
    }
    return * this;
}
/*
////////////////////////////////////////////////////////////////////////////////
[Name]NewArray
[Title]创建成新数组。
////////////////////////////////////////////////////////////////////////////////
[param]
    <XDynamicArray<T> &>srcArray    源数组。
    <int>sIndex          源数组开始的下标
    <int>copySize       要复制源数组的元素个数
[Exception]
    Exception      如果发生错误,则抛出异常
    EOutOfMemory   如果new出内存失败,则抛出EOutOfMemory异常
[Description]
    从指定的数组中,将自已更新为新的数组,新数组的大小,为指定COPY的大小
    注:如果指定的数组就是当前数组本身,NewArray方法会正常COPY,不会有问题
[Version]1.0
[Author]Rex Winter
[Date]2005-4-26
////////////////////////////////////////////////////////////////////////////////
*/
template<class T>
void XDynamicArray<T>::NewArray(const XDynamicArray<T> & srcArray,int sIndex, int copySize)
{
    //检查越界
    if( copySize < 0) throw Exception("要复制的大小小于零!");
    //如果新数组的大小为0,则清空数组
    if(copySize == 0)
    {
        Clear();
        return;
    }
    if( sIndex<0 || sIndex + copySize > srcArray.m_Length ) throw Exception("要复制内容,超出源数组大小!");
    //如果不够存放数据,则重新申请一块内存
    if( m_Data->GetLength() < copySize )
    {
        delete m_Data;
        m_Data = new XArray<T>(copySize);
        if(m_Data == NULL) throw EOutOfMemory(EXCEPTION_OUT_OF_MEMORY);
    }
    XArray<T>::CopyArray(*srcArray.m_Data,sIndex,*m_Data,0,copySize);
    m_Length = copySize;
}
/*
////////////////////////////////////////////////////////////////////////////////
[Name]NewArray
[Title]创建成新数组。
////////////////////////////////////////////////////////////////////////////////
[param]
    <XArray<T> &>srcArray    源数组。
    <int>sIndex          源数组开始的下标
    <int>copySize       要复制源数组的元素个数
[Exception]
    Exception      如果发生错误,则抛出异常
    EOutOfMemory   如果new出内存失败,则抛出EOutOfMemory异常
[Description]
    从指定的数组中,将自已更新为新的数组,新数组的大小,为指定COPY的大小
    注:如果指定的数组就是当前数组本身,NewArray方法会正常COPY,不会有问题
[Version]1.0
[Author]Rex Winter
[Date]2005-4-26
////////////////////////////////////////////////////////////////////////////////
*/
template<class T>
void XDynamicArray<T>::NewArray(const XArray<T> & srcArray,int sIndex, int copySize)
{
    //检查越界
    if( copySize < 0) throw Exception("要复制的大小小于零!");
    //如果新数组的大小为0,则清空数组
    if(copySize == 0)
    {
        Clear();
        return;
    }
    if( sIndex<0 || sIndex + copySize > srcArray.GetLength() ) throw Exception("要复制内容,超出源数组大小!");
    //如果不够存放数据,则重新申请一块内存
    if( m_Data->GetLength() < copySize )
    {
        delete m_Data;
        m_Data = new XArray<T>(copySize);
        if(m_Data == NULL) throw EOutOfMemory(EXCEPTION_OUT_OF_MEMORY);
    }
    XArray<T>::CopyArray(srcArray,sIndex,*m_Data,0,copySize);
    m_Length = copySize;
}
};
#endif

⌨️ 快捷键说明

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