封装Vector
#include <iostream>
#include <cstring>
using namespace std;
template <typename T>
class Vector
{
private:
T *start; //指向容器的起始地址
T *last; //指向容器存放数据的下一个位置
T *end; //指向容器的最后的下一个位置
public:
Vector():start(new T),last(start),end(start){} //无参构造
Vector(T *s):start(new T(s)),last(start),end(start){} //有参构造
Vector(const Vector<T> &other) //拷贝构造
{
start=new T[other.end-other.start];
start=other.start;
last=other.last;
end=other.end;
}
Vector &operator=(Vector<T> other) //拷贝赋值
{
delete []start;
this->start=other.start;
for(int i=0;i<(other.end-other.start);i++)
{
start[i]=other.start[i];
}
return *this;
}
~Vector() //析构函数
{
delete start;
start=nullptr;
last=nullptr;
end=nullptr;
}
//类内声明
int Size(); //获取数据元素个数
T &At(int index); //根据下标获取数据
bool Empty(); //判空
bool Full(); //判满
T &Front(); //获取第一个元素
T &Back(); //获取最后一个元素
void Clear(); //清空数据元素
void Expand(); //二倍扩容
void Push_back(T &elem); //尾插
void Pop_back(); //尾删
void Output(); //循环遍历
};
//类外定义
//获取数据元素个数
template <typename T>
int Vector<T>::Size()
{
return last-start;
}
//根据下标获取数据
template <typename T>
T &Vector<T>::At(int index)
{
return *(start+index);
}
//判空
template <typename T>
bool Vector<T>::Empty()
{
return start==last?true:false;
}
//判满
template <typename T>
bool Vector<T>::Full()
{
return last==end?true:false;
}
//获取第一个元素
template <typename T>
T &Vector<T>::Front()
{
return *start;
}
//获取最后一个元素
template <typename T>
T &Vector<T>::Back()
{
return *(last-1);
}
//清空数据元素
template <typename T>
void Vector<T>::Clear()
{
last=start;
}
//二倍扩容
template <typename T>
void Vector<T>::Expand()
{
T *temp=new T[2*Size()];
memcpy(temp,start,sizeof(T)*(end-start));
delete []start;
start=temp;
last=start+Size();
end=start+2*Size();
}
//尾插
template <typename T>
void Vector<T>::Push_back(T &elem)
{
*(last++)=elem;
if(last==end)
Expand();
}
//尾删
template <typename T>
void Vector<T>::Pop_back()
{
if(Empty())
throw string("empty");
last--;
}
//循环遍历
template <typename T>
void Vector<T>::Output()
{
if(Empty())
throw string("empty");
for(int i=0;i<Size();i++)
{
cout<<*(start+i)<<" ";
}
}
int main()
{
Vector<int> v1;
char ch;
memset(&ch,0,sizeof (ch));
int elem=0;
do
{
//尾插
cout<<"请输入尾插元素:"<<endl;
cin>>elem;
v1.Push_back(elem);
cout<<"是否继续尾插?(Y/N)"<<endl;
cin>>ch;
}while(ch=='y'||ch=='Y');
v1.Output();
cout<<endl;
//尾删
try
{
//循环尾删
do
{
v1.Pop_back();
cout<<"是否继续出队?(Y/N)"<<endl;
cin>>ch;
}while(ch=='y'||ch=='Y');
}
catch (string e)
{
if(e=="empty")
cout<<"容器为空!"<<endl;
};
cout<<endl;
cout<<"数据元素个数为:"<<v1.Size()<<endl;
cout<<"第一个元素为:"<<v1.Front()<<endl;
cout<<"最后一个元素为:"<<v1.Back()<<endl;
int index;
cout<<"你要查看第几个元素:"<<" ";
cin>>index;
cout<<"这个值为:"<<v1.At(index-1)<<endl;
return 0;
}
思维导图