1.头文件
#pragma once
#include <assert.h>
template<typename TYPE, typename ARG_TYPE=const TYPE&>
class CArray
{
int m_nSize;
int m_nCount;
TYPE* m_pData;
void ReMalloc(int nCount);
public:
CArray();
~CArray();
int GetSize() const
{
return m_nSize;
}
TYPE& GetAt(int nIndex)
{
assert(nIndex>=0&&nIndex<m_nSize);
return m_pData[nIndex];
}
TYPE GetAt(int nIndex) const
{
assert(nIndex >= 0 && nIndex<m_nSize);
return m_pData[nIndex];
}
TYPE& operator[](int nIndex)
{
assert(nIndex >= 0 && nIndex<m_nSize);
return m_pData[nIndex];
}
TYPE operator[](int nIndex) const
{
assert(nIndex >= 0 && nIndex<m_nSize);
return m_pData[nIndex];
}
void SetAt(int nIndex, ARG_TYPE data)
{
assert(nIndex >= 0 && nIndex < m_nSize);
m_pData[nIndex] = data;
}
void RemoveAll()
{
m_nSize = 0;
}
int Add(ARG_TYPE data);
void RemoveAt(int nIndex, int nCount = 1);
void InsertAt(int nIndex, ARG_TYPE newElement, int nCount=1);
void SetSize(int nNewSize);
const TYPE* GetData() const
{
return m_pData;
}
TYPE* GetData()
{
return m_pData;
}
};
template<typename TYPE, typename ARG_TYPE = const TYPE&>
CArray<TYPE, ARG_TYPE>::CArray()
{
m_nSize = 0;
m_nCount = 8;
m_pData = new TYPE[m_nCount];
}
template<typename TYPE, typename ARG_TYPE = const TYPE&>
CArray<TYPE, ARG_TYPE>::~CArray()
{
delete[]m_pData;
}
template<typename TYPE, typename ARG_TYPE = const TYPE&>
int CArray<TYPE, ARG_TYPE>::Add(ARG_TYPE data)
{
if (m_nSize >= m_nCount)
ReMalloc(m_nSize * 2);
m_pData[m_nSize++] = data;
return 0;
}
template<typename TYPE, typename ARG_TYPE = const TYPE&>
void CArray<TYPE, ARG_TYPE>::ReMalloc(int nCount)
{
TYPE* p = new TYPE[nCount];
if (m_nSize>0)
memcpy(p, m_pData, sizeof(TYPE)*m_nSize);
delete[]m_pData;
m_pData = p;
m_nCount = nCount;
}
template<typename TYPE, typename ARG_TYPE = const TYPE&>
void CArray<TYPE, ARG_TYPE>::SetSize(int nNewSize)
{
if (nNewSize > m_nCount)
ReMalloc(nNewSize * 2);
m_nSize = nNewSize;
}
template<typename TYPE, typename ARG_TYPE = const TYPE&>
void CArray<TYPE, ARG_TYPE>::RemoveAt(int nIndex, int nCount)
{
if (nIndex < 0 || nIndex >= m_nSize)
return;
if (nIndex + nCount > m_nSize)
nCount = m_nSize - nIndex;
int nNext = nIndex + nCount;
while (nNext<m_nSize)
{
m_pData[nIndex++] = m_pData[nNext];
++nNext;
}
m_nSize -= nCount;
}
template<typename TYPE, typename ARG_TYPE = const TYPE&>
void CArray<TYPE, ARG_TYPE>::InsertAt(int nIndex, ARG_TYPE newElement, int nCount)
{
assert(nCount>=0);
if (nIndex < 0 || nIndex > m_nSize)
return;
if (m_nSize + nCount > m_nCount)
ReMalloc(m_nSize + nCount);
memmove(m_pData + nIndex + nCount, m_pData + nIndex, sizeof(TYPE)*(m_nSize - nIndex));
m_nSize += nCount;
while (nCount--)
m_pData[nIndex++] = newElement;
}