📄 xarray.h
字号:
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 + -