//CMy_vector.hpp

//CMy_vector.h
//
//template<class T>
class CMy_vector
{
public:
	CMy_vector();
	~CMy_vector();

public:
	bool push_back(int nData);             //添加到尾部
	bool pop_back(int* pData = 0);         //删除最后一个元素
	bool insert(int nIndex, int nData);    //从任意位置添加
	bool erase(int nIndex, int* pData=0);  //从任意位置删除
	bool remove(int nData);                //删除指定数据
	bool empty();                          //是否为空
	void clear();                          //清空所有
	int findIndex(int nData);              //查找元素所在位置的下标 
	bool findData(int nIndex,int* pData);  //查找索引所对应的数据
	int size();                            //获取当前元素个数
	bool setData(int nIndex, int nData);   //修改下标为nIndex的元素的值为nData

	void Print();
protected:
	bool extend();   //扩展空间

private:

	int* m_pHeader;       //头指针
	int m_nMaxCount;      //当前最多存储元素个数
	int m_nCurrentCount;  //当前存储元素个数
};

//CMy_vector.cpp

#include <stdio.h>
#include "My_vector.h"
CMy_vector::CMy_vector() 
{
	m_nMaxCount = 2;
	m_nCurrentCount = 0;
	m_pHeader = new int[m_nMaxCount]{};
}


CMy_vector::~CMy_vector()
{
}

//************************************
// Method:    push_back
// FullName:  CMy_vector::push_back
// Access:    public 
// Returns:   bool
// Parameter: int nData 新添加的元素
//************************************
bool CMy_vector::push_back(int nData)
{
	//判断是否达到上限,达到了就扩容
	if (m_nMaxCount == m_nCurrentCount)
	{
		if (!extend())
			return false;
	}
	//添加数据
	m_pHeader[m_nCurrentCount++] = nData;
	return true;
}

//************************************
// Method:    pop_back 删除最后一个元素
// FullName:  CMy_vector::pop_back
// Access:    public 
// Returns:   bool
//************************************
bool CMy_vector::pop_back(int* pData/* = 0*/)
{
	//是否为空白表
	if (empty()) return false;
	//保存被删除数据
	if (pData)
	{
		*pData = m_pHeader[m_nCurrentCount - 1];
	}
	//当前元素个数减一
	m_nCurrentCount--;
	return true;
}

//************************************
// Method:    insert
// FullName:  CMy_vector::insert
// Access:    public 
// Returns:   bool
// Parameter: int nIndex   位置索引(下标)
// Parameter: int nData    新添加的数据
//************************************
bool CMy_vector::insert(int nIndex, int nData)
{
	//nIndex是否有效
	if (nIndex < 0 || nIndex > m_nCurrentCount)
	{
		return false;
	}
	//是否达到上限
	if (m_nCurrentCount == m_nMaxCount)
	{
		extend();
	}
	//如果是尾部
	if (nIndex == m_nCurrentCount)
	{
		return push_back(nData);
	}
	//如果是其他位置,就需要移动元素
	for (int i = m_nCurrentCount; i > nIndex;i--)
	{
		m_pHeader[i] = m_pHeader[i - 1];
	}
	m_pHeader[nIndex] = nData;
	m_nCurrentCount++;
	return true;
}

//************************************
// Method:    erase
// FullName:  CMy_vector::erase
// Access:    public 
// Returns:   bool
// Parameter: int nIndex   位置索引
// Parameter: int * pData  被删除的数据(需要,就传一个有效地址)
//************************************
bool CMy_vector::erase(int nIndex, int* pData/* = 0*/)
{
	//nIndex是否有效
	if (nIndex < 0 || nIndex > m_nCurrentCount)
	{
		return false;
	}
	//是否为空表
	if (empty())
	{
		return false;
	}
	//如果是尾部
	if (nIndex == m_nCurrentCount)
	{
		return pop_back(pData);
	}
	//如果是其他位置
	//保存被删除数据
	if (pData)
	{
		*pData = m_pHeader[nIndex];
	}
	//移动元素
	for (int i = nIndex; i < m_nCurrentCount;i++)
	{
		m_pHeader[i] = m_pHeader[i + 1];
	}
	m_nCurrentCount--;
	return true;
}

//************************************
// Method:    remove
// FullName:  CMy_vector::remove
// Access:    public 
// Returns:   bool
// Parameter: int nData  要被删除的数据
//************************************
bool CMy_vector::remove(int nData)
{
	//循环遍历查找数据
	for (int i = 0; i < m_nCurrentCount;i++)
	{
		if (m_pHeader[i] == nData)
		{
			//找到后根据下标删除数据
			return erase(i);
		}
	}
	return false;
}

//************************************
// Method:    empty 是否是空表
// FullName:  CMy_vector::empty
// Access:    public 
// Returns:   bool   
//************************************
bool CMy_vector::empty()
{
	return m_nCurrentCount == 0;
}

//************************************
// Method:    clear  删除所有数据
// FullName:  CMy_vector::clear
// Access:    public 
// Returns:   void
//************************************
void CMy_vector::clear()
{
	if (m_pHeader)
	{
		delete[] m_pHeader;
		m_pHeader = nullptr;
		m_nCurrentCount = 0;
	}
}

//************************************
// Method:    findIndex
// FullName:  CMy_vector::findIndex
// Access:    public 
// Returns:   int
// Parameter: int nData  要查找的索引数据
//************************************
int CMy_vector::findIndex(int nData)
{
	//循环遍历查找数据
	for (int i = 0; i < m_nCurrentCount; i++)
	{
		if (m_pHeader[i] == nData)
		{
			//找到后返回其下标
			return i;
		}
	}
	return -1;
}

//************************************
// Method:    findData
// FullName:  CMy_vector::findData
// Access:    public 
// Returns:   int
// Parameter: int nIndex  要查找的数据索引
//************************************
bool CMy_vector::findData(int nIndex,int* pData)
{
	//nIndex是否有效
	if (nIndex < 0 || nIndex >= m_nCurrentCount)
	{
		return false;
	}
	if (pData)
	{
		*pData = m_pHeader[nIndex];
		return true;
	}
	return false;
}

//************************************
// Method:    size  获取当前元素个数
// FullName:  CMy_vector::size
// Access:    public 
// Returns:   int    
//************************************
int CMy_vector::size()
{
	return m_nCurrentCount;
}

//************************************
// Method:    setData
// FullName:  CMy_vector::setData
// Access:    public 
// Returns:   bool
// Parameter: int nIndex  位置索引
// Parameter: int nData   修改之后的数据
//************************************
bool CMy_vector::setData(int nIndex, int nData)
{
	//nIndex是否有效
	if (nIndex < 0 || nIndex >= m_nCurrentCount)
	{
		return false;
	}
	m_pHeader[nIndex] = nData;
	return true;
}

//************************************
// Method:    extend   扩展空间
// FullName:  CMy_vector::extend
// Access:    protected 
// Returns:   void
//************************************
bool CMy_vector::extend()
{
	//申请一块更大的空间存放数据
	//把原来的数据拷贝过来后,删除原有空间
	int nSize = m_nMaxCount + 10;
	int* pNew = new int[nSize]{};
	if (!pNew) return false;
	//拷贝原有数据
	//memcpy(pNew, m_pHeader, m_nMaxCount*sizeof(int));
	//如果是存储的是对象的话使用如下方式
	for (int i = 0; i < m_nMaxCount;i++)
	{
		pNew[i] = m_pHeader[i]; 
	}
	//是否原有空间
	delete[] m_pHeader;
	m_pHeader = pNew;
	return true;
}

void CMy_vector::Print()
{
	for (int i = 0; i < m_nCurrentCount;i++)
	{
		printf("%d", m_pHeader[i]);
	}
	printf("\n");
}

main.cpp

#include <stdio.h>
#include "My_vector.h"

int main()
{
	CMy_vector myVec;
	myVec.push_back(1);
	myVec.push_back(3);
	myVec.push_back(4);
	myVec.push_back(5);
	myVec.insert(1,2);
	myVec.push_back(6);
	myVec.Print();
	int nData;
	myVec.erase(0, &nData);
	myVec.erase(3, &nData);
	myVec.Print();


	return 0;
}