自己实现简单的类vector容器

只是一个简单的类vector容器,其内存是连续的 ,类似于数组。暂未实现迭代器,等有时间再研究吧。代码比较容易理解,在此基础上可以进行扩展。

//---------------------------------------------------------------------
// vector_sp.h
// @Author		: Shaoguang.
// @Date		: 2018-08-28.
// @Abstract	: 实现简单的类vector容器.
//---------------------------------------------------------------------
#ifndef VECTORSP_H
#define VECTORSP_H

template <typename T>
class vector_sp
{
public:
	vector_sp()
	{
		m_nStepCount = 16;
		m_nEleCount = 0;
		m_nMemCount = 0;
		m_pT = NULL;
	}

	vector_sp(int nStepCount)
	{
		m_nStepCount = nStepCount > 0 ? nStepCount : 1;
		m_nEleCount = 0;
		m_nMemCount = 0;
		m_pT = NULL;
	}

	// 容器包含nCount个值为Value的元素
	vector_sp(int nCount, const T &Value)
	{
		m_nStepCount = 16;
		m_nEleCount = 0;
		m_nMemCount = 0;
		m_pT = NULL;

		while (nCount--)
		{
			Add(Value);
		}
	}

	// 构造一个vec_sp的副本容器
	vector_sp(const vector_sp &vec_sp)
	{
		m_nStepCount = 16;
		m_nEleCount = 0;
		m_nMemCount = 0;
		m_pT = NULL;

		CopyVector(vec_sp);
	}

	~vector_sp()
	{
		if (NULL != m_pT)
		{
			delete[]m_pT;
			m_pT = NULL;
		}
	}

public:
	// 设置扩容步长.
	void SetStep(int nStepCount)
	{
		m_nStepCount = nStepCount > 0 ? nStepCount : 1;
	}

	// 首元素指针
	T *First()
	{
		return m_pT;
	}

	// 末元素指针
	T *Last()
	{
		return m_pT + m_nEleCount - 1;
	}

	// 第n个元素指针
	T *GetAt(int nPosition)
	{
		return m_pT + nPosition;
	}

	// 第n个元素,返回元素的引用
	T &RefAt(int nIndex)
	{
		return m_pT[nIndex];
	}

	// 第n个元素
	T At(int nIndex)
	{
		return m_pT[nIndex];
	}

	// 重新分配内存
	void Resize(int nMemSize)
	{
		RemoveAll();
		m_nEleCount = 0;
		m_nMemCount = nMemSize;
		m_pT = new T[m_nMemCount];
	}

	// 取元素个数
	int Count() const
	{
		return m_nEleCount;
	}

	// 设置/修改某个元素的值
	void SetAt(int nIndex, const T &newElement)
	{
		m_pT[nIndex] = newElement;
	}

	// 移除某个元素
	void RemoveAt(int nIndex)
	{
		for (int i = 0; i < m_nEleCount; ++i)
		{
			m_pT[i] = m_pT[i + 1];
		}
		m_nEleCount--;
	}

	// 移除所有,清空内存
	void RemoveAll()
	{
		if (NULL != m_pT)
		{
			delete[]m_pT;
			m_pT = NULL;
		}
		m_nEleCount = 0;
		m_nMemCount = 0;
	}

	// 判断是否为空
	bool Empty()
	{
		return m_nEleCount < 1;
	}

	// 在末尾添加元素
	void Add(const T &newElement)
	{
		if (m_nEleCount == m_nMemCount)
		{
			T *pTemp = new T[m_nMemCount += m_nStepCount];
			for (int i = 0; i < m_nEleCount; ++i)
			{
				pTemp[i] = m_pT[i];
			}

			delete[]m_pT;
			m_pT = pTemp;
		}

		m_pT[m_nEleCount++] = newElement;
	}

	// 插入元素
	void Insert(int nIndex, const T &newElement)
	{
		Add(newElement);
		for (int i = m_nEleCount - 1; i > nIndex; i--)
		{
			m_pT[i] = m_pT[i - 1];
		}	

		m_pT[nIndex] = newElement;
	}

	// 在末尾添加一组元素
	void AddBlock(const T *pNewElement, int nCount)
	{
		while (nCount--)
		{
			Add(pNewElement[i]);
		}
	}

	// 在特定位置添加一组元素
	void AddBlockAt(int nIndex, const T *pNewElement, int nCount)
	{
		AddBlock(pNewElement, nCount);
		for (int i = m_nEleCount - 1; i > m_nEleCount - nCount - 1; i--)
		{
			m_pT[i] = m_pT[i - nCount];
		}

		for (int i = 0; i < nCount; ++i)
		{
			m_pT[nIndex + i] = pNewElement[i];
		}
	}

	// 操作符重载
	void operator=(const vector_sp &src)
	{
		CopyVector(src);
	}

	T &operator[](int nIndex)
	{
		return m_pT[nIndex];
	}

	bool operator==(const vector_sp &src)
	{
		if (m_nEleCount != src.m_nEleCount)
			return false;

		if (m_nEleCount > 0)
		{
			for (int i = 0; i < m_nEleCount; ++i)
			{
				if (m_pT[i] != src.m_pT[i])
					return false;
			}
		}

		return true;
	}

private:
	void CopyVector(const vector_sp &src)
	{
		if (m_nMemCount < src.m_nMemCount)
		{
			delete[] m_pT;
			m_nMemCount = src.m_nMemCount;
			m_pT = new T[m_nMemCount];
		}

		m_nEleCount = src.m_nEleCount;
		m_nStepCount = src.m_nStepCount;
		if (m_nEleCount < 1)
			return;
		for (int i = 0; i < m_nEleCount; ++i)
		{
			m_pT[i] = src.m_pT[i];
		}
	}

private:
	T		*m_pT;
	int		m_nEleCount;	// 元素个数.
	int		m_nMemCount;	// 总个数.
	int		m_nStepCount;	// 扩容步长.
}; // class vector_sp

#endif // !VECTORSP_H

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值