C++开发模板化动态数组CArray类

1.头文件

//Array.h
#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;	
}
发布了19 篇原创文章 · 获赞 18 · 访问量 2849

猜你喜欢

转载自blog.csdn.net/weixin_42844163/article/details/104156048