Vector代码实现(模板)

简易的vector代码实现,目前实现了以下方法:

  • insert
  • delete
  • operate[]

C++源码

#pragma  once

#include <iostream>
const int DEFAULT_VECTOR_LEN = 4;
template <typename T>
class CSLVector
{

public:
	CSLVector();
	~CSLVector();

	bool Insert(T oData);

	bool Delete(int i);

	int Find(T oData);

	void Clear();

	void Print();

	T& operator[](int i);
	int  Size() 
	{ 
		return m_iCapacity; 
	}

	int Count() 
	{
		return m_iCount;
	}
private:
	void Rellocate();
private:
	T* m_pData;
	int m_iCapacity;
	int m_iCount;
};

template <typename T>
CSLVector<T>::CSLVector():m_pData(nullptr), m_iCapacity(DEFAULT_VECTOR_LEN), m_iCount(0)
{
}

template <typename T>
CSLVector<T>::~CSLVector()
{
	Clear();
}

template <typename T>
void CSLVector<T>::Rellocate()
{
	T* pTemp = (T*)malloc(m_iCapacity * sizeof(T));
	memcpy(pTemp, m_pData, m_iCount * sizeof(T));
	free(m_pData);
	m_pData = pTemp;
}
template <typename T>
bool CSLVector<T>::Insert(T oData)
{
	int i = sizeof(T);
	if (m_pData == nullptr)
	{
		m_pData = (T*)malloc(m_iCapacity * sizeof(T));
	}

	if (m_iCount + 1 == m_iCapacity)
	{
		m_iCapacity *= 2;
		Rellocate();
	}

	memcpy(m_pData + m_iCount, &oData, sizeof(T));
	++m_iCount;

	return true;
}

template <typename T>
bool CSLVector<T>::Delete(int i)
{
	if (i >= m_iCount)
	{
		return false;
	}

	if (i != m_iCount - 1)
	{
		memcpy(m_pData + i, m_pData + i + 1, (m_iCount - i - 1) * sizeof(T));
	}
	--m_iCount;
	
	if (m_iCount * 4 < m_iCapacity && m_iCapacity > DEFAULT_VECTOR_LEN)
	{
		m_iCapacity /= 2;
		Rellocate();
	}
	return true;
}


template <typename T>
T& CSLVector<T>::operator[](int i)
{
	T* pData = m_pData + i;
	return *pData;
}

template <typename T>
void CSLVector<T>::Clear()
{
	if (m_pData != nullptr)
	{
		free(m_pData);
		m_pData = nullptr;
	}

	m_iCount = 0;
	m_iCapacity = DEFAULT_VECTOR_LEN;

}

template <typename T>
void CSLVector<T>::Print()
{
	using namespace std;
	for (int i = 0; i < m_iCount; ++i)
	{
		cout << m_pData[i] << "\t";
	}
	cout << endl;
}


template <typename T>
int CSLVector<T>::Find(T oData)
{
	for (int i = 0; i < m_iCount; ++i)
	{
		if (oData == m_pData[i])
		{
			return i;
		}
	}
	return -1;
}


使用样例:

#include <iostream>
#include "vector.h"
using namespace std;

int main(int argc, char* argv[])
{
	CSLVector<int> oSLVector;
	cout << "*******Should print empty vector*******" <<endl;
	oSLVector.Print();

	int* pNumList = new int[20];
	for (int i = 0; i < 20; i++)
	{
		pNumList[i] = i;
	}

	cout << "*******Insert vector*******" << endl;
	for (int i = 0; i < 20; i++)
	{
		oSLVector.Insert(pNumList[i]);
	}
	oSLVector.Print();

	cout << "*******Find in vector*******" << endl;
	for (int i = 0; i < 40; i++)
	{
		int iPos = oSLVector.Find(i);
		if (iPos >= 0)
		{
			cout << "Find [" << i <<"] success, pos ["<< iPos  <<"]" << endl;
		}
		else
		{
			cout << "Find [" << i << "] failed" << endl;
		}
	}

	cout << "*******Delete vector*******" << endl;
	for (int i = 18; i >=0; --i)
	{
		oSLVector.Delete(i);
		oSLVector.Print();
	}


	return 0;
}

输出:

 

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值