/*************************************************************************
> File Name: CArray.h
> Author: ma6174
> Mail: ma6174@163.com
> Created Time: 2018年11月17日 星期六 10时19分23秒
************************************************************************/
//#include<iostream>
//using namespace std;
template<typename TYPE,typename ARG_TYPE = const TYPE&>
class CArray
{
private:
TYPE *m_type;
int m_nSize;
int m_nNew;
public:
CArray();
~CArray();
void Add(ARG_TYPE type); //添加
TYPE GetAt(int nType)const;
int GetSize()const;
void RemoveAll(); //刪除所有數據
void RemoveAt(int nType); //刪除某一個數據
void ChangePosition(int nType1,int nType2); //交換兩個數據的位置
void Insert(ARG_TYPE type,int nType); //插入數據
//void InsertFront(ARG_TYPE type,int nType); //往前面插入數據
//void InsertBehind(ARG_TYPE type,int nType); //往後面插入數據
//修改數據
void Set(ARG_TYPE type,int nType)
{
if(m_nSize <= nType)
return ;
m_type[nType] = type;
}
private:
void Relloc(); //重新分配內存
};
template<typename TYPE,typename ARG_TYPE>
CArray<TYPE,ARG_TYPE>::CArray():m_nSize(0),m_nNew(10)
{
m_type = new TYPE[m_nNew];
}
template<typename TYPE,typename ARG_TYPE>
CArray<TYPE,ARG_TYPE>::~CArray()
{
RemoveAll();
}
template<typename TYPE,typename ARG_TYPE>
void CArray<TYPE,ARG_TYPE>::Add(ARG_TYPE type)
{
if(m_nSize >= m_nNew)
Relloc();
m_type[m_nSize] = type;
m_nSize++;
}
template<typename TYPE,typename ARG_TYPE>
TYPE CArray<TYPE,ARG_TYPE>::GetAt(int nType)const
{
return m_type[nType];
}
template<typename TYPE,typename ARG_TYPE>
int CArray<TYPE,ARG_TYPE>::GetSize()const
{
return m_nSize;
}
template<typename TYPE,typename ARG_TYPE>
void CArray<TYPE,ARG_TYPE>::RemoveAll()
{
delete []m_type;
m_nSize = 0;
}
template<typename TYPE,typename ARG_TYPE>
void CArray<TYPE,ARG_TYPE>::RemoveAt(int nType)
{
if(m_nSize <= nType)
return ;
while(m_nSize > nType)
{
m_type[nType] = m_type[nType+1];
nType++;
}
m_type[m_nSize-1] = 0;
m_nSize--;
}
template<typename TYPE,typename ARG_TYPE>
void CArray<TYPE,ARG_TYPE>::ChangePosition(int nType1,int nType2)
{
if(m_nSize <= nType1 || m_nSize <= nType2)
return ;
TYPE temp = m_type[nType1];
m_type[nType1] = m_type[nType2];
m_type[nType2] = temp;
}
template<typename TYPE,typename ARG_TYPE>
void CArray<TYPE,ARG_TYPE>::Insert(ARG_TYPE type,int nType)
{
if(m_nSize >= m_nNew)
Relloc();
if(nType > m_nSize)
return ;
int i = m_nSize;
while(nType != i)
{
m_type[i] = m_type[i-1];
i--;
}
m_type[nType] = type;
m_nSize++;
}
/*
template<typename TYPE,typename ARG_TYPE>
void CArray<TYPE,ARG_TYPE>::InsertFront(ARG_TYPE type,int nType)
{
if(0 == nType)
return ;
nType = nType-1;
int i = m_nSize;
if(m_nSize > m_nNew)
Relloc();
while(nType != i)
{
m_type[i] = m_type[i-1];
i--;
}
m_type[nType] = type;
m_nSize++;
}
template<typename TYPE,typename ARG_TYPE>
void CArray<TYPE,ARG_TYPE>::InsertBehind(ARG_TYPE type,int nType)
{
if(m_nSize > m_nNew)
Relloc();
nType = nType + 1;
int i = m_nSize;
while(nType != i)
{
m_type[i] = m_type[i-1];
i--;
}
m_type[nType] = type;
m_nSize++;
}
*/
template<typename TYPE,typename ARG_TYPE>
void CArray<TYPE,ARG_TYPE>::Relloc()
{
m_nNew = m_nNew*2;
TYPE *t = new TYPE[m_nNew];
while(-1 < m_nSize)
{
t[m_nSize] = m_type[m_nSize];
m_nSize--;
}
RemoveAll();
m_type = t;
}