?? 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 + -