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