//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;
}