#include "myvector.h"
//构造初始化
template <class T>
myvector<T>::myvector()
{
p = nullptr;
n = realn = ;
}
//析构函数清空内存
template <class T>
myvector<T>::~myvector()
{
if (p!=nullptr)
{
delete []p;
p = nullptr;//清空
}
}
//尾部插入
template <class T>
void myvector<T>::push_back(T t)
{
//如果是空指针
if (p==nullptr)
{
//分配内存
p = new T;
//赋值
*p = t;
//真实的长度和当前长度都赋值为1
realn = n = ;
}
else
{
//如果不为空则重新分配内存
T *ptemp = new T[n + ];
//拷贝到新的空间
for (int i = ; i < n;i++)
{
*(ptemp + i) = *(p + i);
}
//赋值最后一个元素
*(ptemp + n) = t;
//把原来的空间给删除
delete []p;
//指向新的空间
p = ptemp;
//真实长度与预留总长度都加1
realn += ;
n += ;
}
}
//显示数据
template <class T>
void myvector<T>::show()
{
if (p==NULL)
{
return;
}
else
{
//遍历
for (int i = ; i < realn;i++)
{
cout << p[i] << " ";
}
cout << "\n";
}
}
//查询某一个数据
template <class T>
T * myvector<T>::find(T t)
{
//遍历查询,返回指针位置
for (int i = ; i < realn; i++)
{
if (t==*(p+i))
{
return p + i;
}
}
return nullptr;
}
//改变指定位置的数据
template <class T>
void myvector<T>::change(T*pos, T t)
{
//如果位置为空
if (pos==nullptr)
{
return;
}
//如果不为空
else
{
*pos = t;
}
}
//删除某指定的第一个数据
template <class T>
void myvector<T>::del(T t)
{
//标识有没有找到
int pos = -;
//遍历查找,如果找到了记录位置
for (int i = ; i < realn; i++)
{
if (t == *(p + i))
{
pos = i;
break;
}
}
//如果找到
if (pos!=-)
{
//如果是最后一个元素
if (pos== realn-)
{
realn -= ;
}
//如果不是最后一个元素,则向前移动
else
{
for (int i = pos; i < realn-;i++)
{
p[i] = p[i + ];
}
realn -= ;
}
}
}
//插入
template <class T>
void myvector<T>::insert(T findt, T t)
{
//如果预留长度满了
if (n == realn)
{
//找到指定位置
int pos = -;
for (int i = ; i < realn; i++)
{
if (findt == *(p + i))
{
pos = i;
break;
}
}
//如果找到了
if (pos != -)
{
//重新分配内存并拷贝
T *ptemp = new T[n + ];//重新分配内存
for (int i = ; i < n; i++)
{
*(ptemp + i) = *(p + i);//拷贝
}
//删除原数据
delete[] p;
//指向新内存
p = ptemp;
//预留长度加1
realn += ;
//真实长度加1
n += ;
//指定位置数据往后移
for (int i = realn - ; i >= pos; i--)
{
p[i + ] = p[i];//往前移动
}
//要插入的位置赋值
p[pos] = t;
}
}
//如果预留的长度没有满,则不用重新分配内存
else
{
//找到指定位置
int pos = -;
for (int i = ; i < realn; i++)
{
if (findt == *(p + i))
{
pos = i;
break;
}
}
//如果找到了
if (pos != -)
{
//指定位置数据往后移
for (int i = realn - ; i >= pos; i--)
{
p[i + ] = p[i];
}
p[pos] = t;
realn += ;
}
}
}
//重载[]运算符
template <class T>
T myvector<T>::operator [](int i)
{
if (i < || i>=realn)
{
return NULL;
}
return p[i];
}