自己写的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
    评论
[选做]下面是一个数组CArray的定义。要求: (1)在此基础上增加print()成员函数打印数组, (2)重载“=”、“+”、“-” 运算符使之能对该数组对象进行赋值、加减运算。 (3)出主函数对该进行测试。 class CArray {private: int* p_arr; int size; public: CArray(); //缺省构造函数 CArray(int* p_a,int s); //构造函数 CArray(const CArray &r_other);//复制构造函数 ~CArray();//析构函数 int operator[](int pos) const; //访问数组元素值的下标运算符重载函数 int& operator[](int pos); //设置数组元素值的下标运算符重载函数 CArray &operator=(const CArray &other)//赋值运算符“=”重载函数 CArray operator+(const CArray &other) //加运算符“+”重载函数 CArray operator-(const CArray &other) //减运算符“-”重载函数 void print() const; }; CArray:: CArray() { p_arr=NULL; size=0;} CArray:: CArray(int* p_a,int s) { if(s>0) { size=s; p_arr=new int[size]; for(int i=0;i<size;i++) p_arr[i]=p_a[i]; } Else { p_arr=NULL; size=0; } } CArray::CArray(const CArray &r_other) { size=r_other.size; if(size) { p_arr=new int[size]; for(int i=0;i<size;i++) p_arr[i]=r_other.p_arr[i]; } } CArray::~CArray() { if(p_arr) delete[] p_arr; p_arr=NULL; size=0; } int CArray::operator[](int pos) const { if(pos>=size) return p_arr[size-1]; if(pos<0) return p_arr[0]; return p_arr[pos]; } int& CArray::operator[](int pos) { if(pos>=size) return p_arr[size-1]; if(pos<0) return p_arr[0]; return p_arr[pos]; }
最新发布
06-03
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值