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

📄 xarray.h

📁 BCB的学习资料
💻 H
📖 第 1 页 / 共 3 页
字号:
{
    if(m_Data != NULL) delete[] m_Data;
    m_Length = 0;
}

/*
////////////////////////////////////////////////////////////////////////////////
[Name]static CopyArray
[Title]复制数组
////////////////////////////////////////////////////////////////////////////////
[param]
    <XArray<T> &>srcArray    原数组
    <int>srcIndex           原数组开始的下标
    <XArray<T> &>destArray   目的数组
    <int>destIndex          目的数组开始的下标
    <int>copySize           复制的数组元素
[Exception]
    Exception  如果发生越界错误,则抛出Exception异常
[Description]
    用memcpy代替了原来的复制算法
    复制数组的数据,从srcArray复制从srcIndex开始的数据,到destArray从destIndex开始的位置,
    复制的大小为copySize
    如果发生数据越界,将会抛出异常

[Version]1.0
[Author]Rex Winter
[Date]2005-4-22
////////////////////////////////////////////////////////////////////////////////
*/
template<class T>
void XArray<T>::CopyArray(const XArray<T> & srcArray,int srcIndex, XArray<T> & destArray, int destIndex, int copySize)
{
    //检查越界
    if( copySize < 0) throw Exception("要复制的大小小于零!");
    if( srcIndex<0 || srcIndex + copySize > srcArray.m_Length ) throw  Exception("要复制内容,超出源数组大小!");
    if( destIndex<0 || destIndex + copySize > destArray.m_Length ) throw Exception("要复制内容,越出目的数组大小!");
    if( &srcArray == &destArray)
    {
        if( destIndex > srcIndex )
        {
            //如果要复制的数据,在目的数据前面,那么就在最后开始复制,避免重复制
            T * src = srcArray.m_Data + srcIndex + copySize - 1;
            T * dest = destArray.m_Data + destIndex + copySize -1;
            for(int i=0; i<copySize; i++)
            {
                *dest = *src;
                dest--;
                src--;
            }
        }
        else if( destIndex < srcIndex )
        {
            T * src = srcArray.m_Data + srcIndex;
            T * dest = destArray.m_Data + destIndex;
            for(int i=0; i<copySize; i++)
            {
                *dest = *src;
                dest++;
                src++;
            }
        }
    }
    else
    {
        T * src = srcArray.m_Data + srcIndex;
        T * dest = destArray.m_Data + destIndex;
        for(int i=0; i<copySize; i++)
        {
            *dest = *src;
            dest++;
            src++;
        }
    }
}

/*
////////////////////////////////////////////////////////////////////////////////
[Name]NewArray
[Title]创建成新数组。
////////////////////////////////////////////////////////////////////////////////
[param]
    <XArray<T> &>srcArray    源数组。
    <int>srcIndex           源数组开始的下标
    <int>copySize       要复制源数组的元素个数
[Exception]
    Exception      如果发生错误,则抛出异常
    EOutOfMemory   如果new出内存失败,则抛出EOutOfMemory异常
[Description]
    从指定的数组中,将自已更新为新的数组,新数组的大小,为指定COPY的大小
    注:如果指定的数组就是当前数组本身,NewArray方法会正常COPY,不会有问题
[Version]1.0
[Author]Rex Winter
[Date]2005-4-22
////////////////////////////////////////////////////////////////////////////////
*/
template<class T>
void XArray<T>::NewArray(const XArray<T> & srcArray,int srcIndex,int copySize)//XArray<T> & src,int sPos,int copySize)
{
    //检查越界
    if( copySize < 0) throw Exception("要复制的大小小于零!");
    if(copySize == 0)
    {
        if(m_Data != NULL) {
            delete[] m_Data;
            m_Data = NULL;
        }
        m_Length = 0;
        return;
    }
    if( srcIndex<0 || srcIndex + copySize > srcArray.m_Length ) throw Exception("要复制内容,超出源数组大小!");

    if( &srcArray == this )//如果就是为当前数组对象,则要新申请一块内存
    {
        T * tmp = new T[copySize];

        T * src = srcArray.m_Data + srcIndex;
        T * dest = tmp;
        //打开CodeGuard的时候,这里可能会提示指针计算越界,但实际不会引用越界指针
        for(int i=0; i<copySize; i++)
        {
            *dest =*src;
            dest++;
            src++;
        }
        delete[] m_Data;
        m_Data = tmp;
        m_Length = copySize;
    }
    else//如果不是当前数组对象
    {
        //重定义数据
        if( m_Length < copySize) //如果已有数组容量小于要COPY的容量,则重新申请一块内存
        {
            if(m_Data != NULL) delete[] m_Data;
            m_Data = new T[copySize];
            if(m_Data == NULL) throw EOutOfMemory(EXCEPTION_OUT_OF_MEMORY);
        }
        T * src = srcArray.m_Data + srcIndex;
        T * dest = m_Data;
        //打开CodeGuard的时候,这里可能会提示指针计算越界,但实际不会引用越界指针
        for(int i=0; i<copySize; i++)
        {
            *dest = *src;
            dest++;
            src++;
        }
        m_Length = copySize;
    }
    return;
}
//------------------------------------------------------------------------------
/*
////////////////////////////////////////////////////////////////////////////////
[Name]XDynamicArray
[Title]XDynamicArray<T>的构造函数
////////////////////////////////////////////////////////////////////////////////
[Param]
    <int default=0>InitLength 初始数组的大小
    <int default=0>iPrepareLength 预申请的元素个数
[Exception]
    EOutOfMemory 如果申请内存,则抛出该异常
[Description]
    构造函数,需要指定大小,如果未指定,则默认大小为0
[Version]1.0
[Author]Rex Winter
[Date]2005-4-22
////////////////////////////////////////////////////////////////////////////////
*/
template<class T>
XDynamicArray<T>::XDynamicArray(int InitLength,int iPrepareLength)
    :m_Data(NULL),m_Length(0)
{
    //每次分配的预分配的个数是16的整数倍
    if( InitLength < 0 ) InitLength = 0;
    if( iPrepareLength < InitLength ) iPrepareLength = InitLength;
    if( iPrepareLength < 16 )  iPrepareLength = 16;
    if( (iPrepareLength % 16) != 0 ) iPrepareLength = iPrepareLength - iPrepareLength % 16 + 16;

    m_Data = new XArray<T>(iPrepareLength);
    if( m_Data == NULL ) throw EOutOfMemory(EXCEPTION_OUT_OF_MEMORY);
    m_Length = InitLength;
}
/*
////////////////////////////////////////////////////////////////////////////////
[Name]XDynamicArray
[Title]XDynamicArray<T>的拷贝构造函数
////////////////////////////////////////////////////////////////////////////////
[Param]
    <const XDynamicArray<T> &>srcArray 源数组
[Exception]
    EOutOfMemory 如果申请内存失败,则抛出该异常    
[Description]
    构造拷贝函数
[Version]1.0
[Author]Rex Winter
[Date]2005-4-22
////////////////////////////////////////////////////////////////////////////////
*/
template<class T>
XDynamicArray<T>::XDynamicArray(const XDynamicArray<T> & srcArray)
    :m_Data(NULL),m_Length(srcArray.m_Length)
{
    m_Data = new XArray<T>( *srcArray.m_Data );
    if( m_Data == NULL ) throw EOutOfMemory(EXCEPTION_OUT_OF_MEMORY);
}
/*
////////////////////////////////////////////////////////////////////////////////
[Name]XDynamicArray
[Title]XDynamicArray<T>的构造函数
////////////////////////////////////////////////////////////////////////////////
[Param]
    <const XArray<T> &>srcArray 源数组
    <int default=0>iPrepareLength 预申请的元素个数
[Exception]
    EOutOfMemory 如果申请内存失败,则抛出该异常
[Description]
    构造函数,以静态数组为参数
[Version]1.0
[Author]Rex Winter
[Date]2005-4-22
////////////////////////////////////////////////////////////////////////////////
*/
template<class T>
XDynamicArray<T>::XDynamicArray(const XArray<T> & srcArray,int iPrepareLength)
    :m_Data(NULL),m_Length(0)
{
    int SrcLength = srcArray.GetLength();
    if( iPrepareLength < SrcLength ) iPrepareLength = SrcLength;
    if( iPrepareLength < 16 )  iPrepareLength = 16;
    if( (iPrepareLength % 16) != 0 ) iPrepareLength = iPrepareLength - iPrepareLength % 16 + 16;

    m_Data = new XArray<T>(iPrepareLength);
    if( m_Data == NULL ) throw EOutOfMemory(EXCEPTION_OUT_OF_MEMORY);
    XArray<T>::CopyArray( srcArray, 0, *m_Data, 0, SrcLength);
    m_Length = SrcLength;
}
/*
////////////////////////////////////////////////////////////////////////////////
[Name]XDynamicArray
[Title]XDynamicArray<T>的构造函数
////////////////////////////////////////////////////////////////////////////////
[Param]
    <const T *> data  指向初始化数据的指针
    <int> InitLength 初始化数据的个数
    <int default=0>iPrepareLength 预申请的元素个数
[Exception]
    EOutOfMemory 如果申请内存失败,则抛出该异常
[Description]
    构造函数,以静态数组为参数
[Version]1.0
[Author]Rex Winter
[Date]2005-4-22
////////////////////////////////////////////////////////////////////////////////
*/
template<class T>
XDynamicArray<T>::XDynamicArray(const T * data,int InitLength,int iPrepareLength)
{
    if( InitLength < 0 ) InitLength = 0;
    if( iPrepareLength < InitLength ) iPrepareLength = InitLength;
    if( iPrepareLength < 16 )  iPrepareLength = 16;
    if( (iPrepareLength % 16) != 0 ) iPrepareLength = iPrepareLength - iPrepareLength % 16 + 16;

    m_Data = new XArray<T>(iPrepareLength);
    if( m_Data == NULL ) throw EOutOfMemory(EXCEPTION_OUT_OF_MEMORY);
    m_Length = InitLength;

    if( InitLength > 0 )  //如果需要copy data
    {
        T * dest = (T *)m_Data->Data();
        for(int i = 0; i< InitLength; i++)
        {
            *dest = *data;
            dest++;
            data++;
        }
    }
}
/*
////////////////////////////////////////////////////////////////////////////////
[Name]expandCapacity
[Title]扩展所需的空间
////////////////////////////////////////////////////////////////////////////////
[param]
    <int>minimumCapacity      所需的最小空间
[Description]
    计算并分配空间
[Version]1.0
[Author]Rex Winter
[Date]2005-4-22
////////////////////////////////////////////////////////////////////////////////
*/
template<class T>
void XDynamicArray<T>::expandCapacity(int minimumCapacity)
{
    int newCapacity;
    if( m_Data->GetLength() > 0 ) newCapacity = m_Data->GetLength() * 2;
    else newCapacity = 16;
    if (newCapacity < 0)
    {
          newCapacity = 0x7fffff;//最大32位正整数
    }
    else if (minimumCapacity > newCapacity)
    {
        newCapacity = minimumCapacity;
    }
    //确认分配的元素个数为16的整数倍
    if( (newCapacity % 16) != 0 ) newCapacity = newCapacity - newCapacity % 16 + 16;
    XArray<T> * newArray = new XArray<T>( newCapacity );
    if( m_Length > 0 ) XArray<T>::CopyArray( *m_Data, 0, *newArray, 0, m_Length);
    delete m_Data;
    m_Data = newArray;
}
/*
////////////////////////////////////////////////////////////////////////////////
[Name]~XDynamicArray
[Title]XDynamicArray<T>的析构函数
////////////////////////////////////////////////////////////////////////////////
[Description]
    析构函数
[Version]1.0
[Author]Rex Winter
[Date]2005-4-22
////////////////////////////////////////////////////////////////////////////////
*/
template<class T>
XDynamicArray<T>::~XDynamicArray()
{
    delete m_Data;
}

/*
////////////////////////////////////////////////////////////////////////////////
[Name]CopyArray
[Title]复制数组
////////////////////////////////////////////////////////////////////////////////
[param]
    <XDynamicArray<T> &>srcArray       原数组
    <int>srcIndex                   原数组开始的下标
    <XDynamicArray<T> &>destArray   目的数组
    <int>destIndex                  目的数组开始的下标
    <int>copySize                   复制的数组元素
[Exception]
    Exception  如果发生错误,则抛出Exception异常
[Description]
    复制数组的数据,从src复制从srcIndex开始的数据,到dest开始的位置,复制的大小为copySize
    如果发生数据越界,将会抛出异常

[Version]1.0
[Author]Rex Winter
[Date]2005-4-22
////////////////////////////////////////////////////////////////////////////////
*/
template<class T>
void XDynamicArray<T>::CopyArray(const XDynamicArray<T> & srcArray,int srcIndex, XDynamicArray<T> & destArray, int destIndex, int copySize)
{
    //检查越界
    if( (destIndex == 0) && (copySize > destArray.m_Length) ) return destArray.NewArray( srcArray, srcIndex, copySize);

    if( copySize < 0 ) throw Exception("要复制的大小小于零!");

    if( (srcIndex < 0) || (srcIndex + copySize > srcArray.m_Length) ) throw Exception("要复制内容,超出源数组大小!");

    if( destIndex < 0 ) throw Exception("要复制内容,越出目的数组大小!");

    destArray.ensureCapacity( destIndex + copySize ); //确定最小要的空间
    XArray<T>::CopyArray( *srcArray.m_Data, srcIndex, *destArray.m_Data, destIndex, copySize);
    if( (destIndex + copySize) > destArray.m_Length ) destArray.m_Length = destIndex + copySize;
}

/*
////////////////////////////////////////////////////////////////////////////////
[Name]operator []
[Title]取得数组元素。
////////////////////////////////////////////////////////////////////////////////
[param]
    <int>Index    对应的数组的下标
[Return]
    <T&>返回数组元素的引用。
[Exception]
    XExceptionArrayOutOfRange  如果下标越界,则抛出XExceptionArrayOutOfRange异常
[Description]
    取得数组元素,并返回这个元素的引用。
[Version]1.0
[Author]Rex Winter
[Date]2005-4-26
////////////////////////////////////////////////////////////////////////////////
*/
template<class T>
T & XDynamicArray<T>::operator[](int Index)
{
    if( Index<0 || Index >= m_Length ) throw XExceptionArrayOutOfRange(Index, m_Length);
    return m_Data->operator[](Index);
}
/*
////////////////////////////////////////////////////////////////////////////////
[Name]operator [] const
[Title]取得数组元素。
////////////////////////////////////////////////////////////////////////////////
[param]
    <int>Index    对应的数组的下标
[Return]
    <const T&>返回数组元素的引用。但这个返回值不能修改的
[Exception]
    XExceptionArrayOutOfRange  如果下标越界,则抛出XExceptionArrayOutOfRange异常
[Description]
    取得数组元素,并返回这个元素的引用。
    这个方法,注明为const类型,表示为不可修改。
[Version]1.0
[Author]Rex Winter
[Date]2005-4-26
////////////////////////////////////////////////////////////////////////////////
*/

⌨️ 快捷键说明

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