/**********************************************************************************
自定义CArray模板类:动态数组类
*/


template 
<class T>
class CMyArray  
{
public:
    
//构造
    CMyArray(int num=4)
    
{
        m_data
=new T[num];
        m_count
=0;
        m_Size
=num;
    }

    
//析构
    virtual ~CMyArray()
    
{
        
if(m_data)    
            delete [] m_data;
    }


//方法    
public:
    
int Add(T &data);
    T
& operator []( int nIndex );
    T GetAt( 
int nIndex ) const;
    
void SetAt( int nIndex, T &data );
    
void RemoveAt( int nIndex, int nCount = 1 );
    
int GetSize( ) const  return  m_count;}
    
private:
    
void ReAlloc();

//属性    
private:
    T        
*m_data;
    
int       m_Size;//Array总的尺寸:=largest index+1
    int       m_count;//当前内容
}
;
/**************************************************************************
几个重要方法的实现部分
*/


template 
<class T>
int CMyArray<T>::Add(T &data)
{
    
if(m_count>=m_Size)
    
{
        ReAlloc();
    }

    m_data[m_count
++]=data;
    
return m_count;
}


//重新分配内存
template <class T>
void CMyArray<T>::ReAlloc()
{
    
int len=m_Size*2+1;
    T 
*p=new T[len];//扩展了一倍内存
    memcpy(p,m_data,m_Size*sizeof(T));
    delete m_data;
    m_data
=p;
    m_Size
=len;
}


//重载
template <class T>
T
& CMyArray<T>::operator [](int nIndex)
{
    assert(nIndex
<m_count || nIndex>0); 
    
return m_data[nIndex];
}


//得值
template <class T>
T CMyArray
<T>::GetAt( int nIndex ) const
{
    assert(nIndex
<m_count || nIndex>0); 
    
return m_data[nIndex];
}


//设值
template <class T>
void CMyArray<T>::SetAt(int nIndex, T &data)
{
    assert(nIndex
<m_Size || nIndex>0); 
    m_data[nIndex]
=data;
}


//移除
template <class T>
void CMyArray<T>::RemoveAt(int nIndex, int nCount)
{
    assert(nIndex
+nCount-1<m_count ||nIndex>0 ); 
    memcpy(m_data
+nIndex,m_data+nIndex+nCount,(m_count-nIndex-nCount)*sizeof(T));
    m_count
--;
}