//使用C++函数模板实现一个Vector。
#include
#include<string.h>
template
class Vector
{
public:
Vector(int size = 20)
{
parr = new T[size];
cursize = 0;
totalsize = size;
}
bool VectorEmpty();//判空
void ClearVector();//清空
void Resize_double();//内存扩充为当前空间的二倍
T& GetElem(int pos);//返回第i个元素
int LocateElem(T val);//查找,返回下标
void Pop_back();//删除末尾元素
void Push_back(T val);//在末尾位置插入
T& Top_back();//获取末尾位置元素
void VectorInsert(int pos,T val);//按位置插入
void VectorDelete(int pos);//按位置删除
void Shrink_to_fit();//放弃过多内存
int VectorLength();//表长
void ShowVector();//查看所有数据
~Vector()
{
delete [] parr;
parr = NULL;
}
private:
bool VectorFull()//判满
{
return cursize == totalsize;
}
T * parr;
int cursize;
int totalsize;
};
template
int Vector::VectorLength()//表长
{
return cursize;
}
template
bool Vector::VectorEmpty()//判空
{
return !cursize;
}
template
void Vector::ClearVector()
{
cursize = 0;
}
template
void Vector::Resize_double()
{
T * tmp = new T[totalsize * 2];
memcpy(tmp,parr,sizeof(T)*cursize);
delete [] parr;
parr = tmp;
totalsize *= 2;
}
template
T& Vector::GetElem(int pos)
{
if(VectorEmpty())
{
//抛出异常 异常处理机制
throw std::exception(“Vector is empty!”);
}
if(pos <= 0 || pos > cursize)
{
//抛出异常 异常处理机制
throw std::exception(“pos is error!”);
}
return parr[pos-1];
}
template
int Vector::LocateElem(T val)//查找,返回下标
{
if(VectorEmpty())
{
return -2;
}
for(int i = 0;i < cursize;i++)
{
if(parr[i] == val)
{
return i;
}
}
return -1;
}
template
void Vector::Pop_back()
{
if(VectorEmpty())
{
return;
}
cursize–;
}
template
void Vector::Push_back(T val)
{
if(VectorFull())
{
Resize_double();
}
parr[cursize++] = val;
}
template
T& Vector::Top_back()
{
if(VectorEmpty())
{
//抛出异常 异常处理机制
throw std::exception(“Vector is empty!”);
}
return parr[cursize-1];
}
template
void Vector::VectorInsert(int pos,T val)//按位置插入
{
if(VectorFull())
{
Resize_double();
}
//当输入不合理进行纠正
if(pos < 0) pos = 0;
if(pos > cursize) pos = cursize;
for(int i = cursize - 1; i >= pos;i--)
{
parr[i+1] = parr[i];
}
parr[pos] = val;
cursize++;
}
template
void Vector::Shrink_to_fit()//放弃过多内存
{
if(totalsize <= 100)return ;
if(totalsize <= (cursize* 3))return ;
T * tmp = new T[cursize * 2];
memcpy(tmp,parr,sizeof(T)*cursize);
delete [] parr;
parr = tmp;
totalsize = 2 * cursize;
}
template
void Vector::VectorDelete(int pos)
{
if(VectorEmpty())
{
return ;
}
if(pos <0 || pos >= cursize)
{
//抛出异常 异常处理机制
throw std::exception(“pos is error!”);
}
for(int i = pos;i < cursize-1;i++)
{
parr[i] = parr[i+1];
}
cursize–;
}
template
void Vector::ShowVector()//查看所有数据
{
if(VectorEmpty())
{
std::cout<<“Vector is empty!”<<std::endl;
return ;
}
for(int i = 0;i < cursize;i++)
{
std::cout<<parr[i]<<" ";
}
std::cout<<std::endl;
}
int main()
{
Vector ievc;
int b = ievc.VectorEmpty();
for(int i = 0;i < 400;i++)
{
ievc.Push_back(i);
}
for(int j = 0;j< 350;j++)
{
ievc.Pop_back();
}
ievc.Shrink_to_fit();
ievc.ShowVector();
int a = 10;
}