自己写的CArray类

myArray.h:

#pragma once


template<typename TYPE, typename TYPE_ARG = const TYPE&>
class myArray
{

public:

	myArray(void);
	~myArray(void);

private:
	int m_nSize;//数据长度(也就是实际占用数组的内容的长度)
	int m_nCount;//资源数量(也就是数组的长度)
	TYPE* m_pData;
public:
	
	int GetSize() const//得到数据长度
	{
		return m_nSize;
	}
	int GetCount()const//得到资源的数量
	{
		return m_nCount;
	}
	int GetUpperBound( ) const//得到数组实际使用单元下标上界
	{
		return m_nCount -1;
	}


	TYPE& GetAt(int nIndex) 
	{
		if (nIndex >= 0 && nIndex < m_nSize)
		{
			return m_pData[nIndex];
		}
	}
	//只读对象专用,例如:const CArray<xx,xx> &ar;
	TYPE& GetAt(int nIndex) const
	{
		if (nIndex >=0 && nIndex <m_nSize)
		{
			return m_pData+nIndex;
		}
	}


	TYPE& ElementAt(int nIndex)
	{
		if (nIndex >= 0 && nIndex < m_nSize)
		{
			return m_pData[nIndex];
		}
	}
	//只读对象专用,例如:const CArray<xx,xx> &ar;
	TYPE& ElementAt(int nIndex) const
	{
		if (nIndex >= 0 && nIndex < m_nSize)
		{
			return m_pData[nIndex];
		}
	}


	//只读对象专用,例如:const CArray<xx,xx> &ar;
	TYPE& operator []( int nIndex ) const
	{
		return m_pData[nIndex];
	}
	TYPE& operator []( int nIndex )
	{
		return m_pData[nIndex];
	}
	/************************************************************************/
	/* 以前的版本 const版本返回值是一个对象,现在的版本const版本返回值也是一个对象的引用 */
	/************************************************************************/

	void SetAt(int nIndex, TYPE_ARG newElement)
	{
		if (newElement >=0 && newElement < m_nSize)
		{
			m_pData[nIndex] = newElement;
		}
	}

	void RemoveAll( )
	{
		m_nSize = 0;
	}


	TYPE* GetData()
	{
		return m_pData;
	}
	const TYPE* GetData() const
	{
		return m_pData;
	}

public:
	int Add(TYPE_ARG data );
	void SetSize( int nNewSize);
	void ReMalloc(int nCount);
	void RemoveAt(int nIndex, int nCount = 1);
	void InsertAt(int nIndex, TYPE_ARG data,int nCount);

};


myArray.cpp:

#include "stdafx.h"
#include "myArray.h"
#include <string.h>


template<typename TYPE, typename TYPE_ARG>
myArray<TYPE,TYPE_ARG>::myArray()
{
	m_pData=new TYPE[m_nCount=8];
	m_nSize=0;
}

template<typename TYPE, typename TYPE_ARG>
myArray<TYPE,TYPE_ARG>::~myArray(void)
{
	delete []m_pData;
}

template<typename TYPE, typename TYPE_ARG>
void myArray<TYPE,TYPE_ARG>::ReMalloc(int nCount)
{
	m_nCount = nCount*2;
	TYPE* p = new TYPE[m_nCount];
	memcpy(p,m_pData,sizeof(TYPE)*m_nSize);
	delete []m_pData;
	m_pData = p;
}
template<typename TYPE, typename TYPE_ARG>
void myArray<TYPE,TYPE_ARG>::SetSize( int nNewSize)
{
	if (nNewSize < 0)
		nNewSize = 0;

	m_nSize = nNewSize;

	if (m_nSize > m_nCount)
	{
		ReMalloc(m_nSize);
	}

}

template<typename TYPE, typename TYPE_ARG>
int myArray<TYPE,TYPE_ARG>::Add( TYPE_ARG data )
{
	if (m_nSize >= m_nCount)
		ReMalloc(m_nSize);

	m_pData[m_nSize] = data;
	m_nSize++;
	return m_nSize;
}

template<typename TYPE, typename TYPE_ARG>
void myArray<TYPE,TYPE_ARG>::RemoveAt(int nIndex, int nCount)
{

	if (nIndex > m_nSize)//索引号大于数组实际长度
	{
		return;
	}
	else if (nIndex + nCount >= m_nSize)//索引号加要移除的数量 大于 数组实际的长度
	{
		m_nSize = nIndex;
		return;
	}
	else //索引号加上要移除的数量 小于 数组实际长度
	{
		memcpy(m_pData+nIndex,m_pData+nIndex+nCount,sizeof(TYPE)*(m_nSize-nIndex-nCount));
		m_nSize -= nCount;
	}
}
template<typename TYPE, typename TYPE_ARG>
void myArray<TYPE,TYPE_ARG>::InsertAt(int nIndex, TYPE_ARG data,int nCount)
{
	if (nCount < 0)//插入的数量小于0,直接返回
	{
		return;
	}
	if (nIndex < 0)//要插入的位置索引小于0,则让索引为0
	{
		nIndex = 0;
	}
	if (nIndex >= m_nSize)//索引号大于数组实际长度
	{
		m_nSize = nIndex+ nCount;
		if (m_nSize > m_nCount)//比如数组实际长度为8,在索引12的位置插入5个数字,17 > 16
		{
			ReMalloc(m_nSize);//扩展内存  17*2 = 34,m_nCount = 34
		}
	}
	else//在实际数组中间插入几个数字
	{
		m_nSize = m_nSize + nCount;
		if (m_nSize>m_nCount)
		{
			ReMalloc(m_nSize);
		}
		memcpy(m_pData+nIndex+nCount,m_pData+nIndex,sizeof(TYPE)*(m_nSize-nIndex));
	}
	int i = 0;
	while (i < nCount)
	{
		m_pData[nIndex+i] = data;
		i++;
	}

}


因为是模板,所以使用的时候,要导入myArray.h和myArray.cpp两个文件,或者所有函数都在.h文件当中实现。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值