仿照vector手动实现自己的myVector,最主要实现二倍扩容功能
#include <iostream>
#include<vector>
using namespace std;
template<typename T,typename D>
class myVector
{
private:
T* iterator; //迭代器
D len; //元素总数量
D size; //最大容量
public:
//无参构造
myVector(){};
// 显性定义有参构造函数
myVector(D len,T val);
//析构函数
~myVector();
//拷贝构造函数
myVector(const myVector &other);
//拷贝赋值函数
myVector &operator=(const myVector &other);
//判空
bool myVector_empty();
//判满
bool myVector_full();
//任意位置插入
void myVector_insert(D pos);
//任意位置删除
void myVector_pop(D pos);
//清空容器
void myVector_outall();
//求容器的大小
D myVector_size();
//输出容器内所有元素
void myVector_show();
};
// 显性定义有参构造函数
template<typename T,typename D>
myVector<T,D>::myVector(D len,T val)
{
this->len=len;
size=len;
iterator=new T[size+1];
for(int i=0;i<len;i++)
{
iterator[i]=val;
}
cout<<"myVector::有参构造"<<endl;
}
//析构函数
template<typename T,typename D>
myVector<T,D>::~myVector()
{
delete iterator;
cout<<"myVector::析构函数"<<endl;
}
//拷贝构造函数
template<typename T,typename D>
myVector<T,D>::myVector(const myVector &other)
{
size=other.size;
len=other.len;
iterator=new T(size);
for(int i=0;i<len;i++)
{
iterator[i]=other.iterator[i];
}
cout<<"myVector::拷贝构造函数"<<endl;
}
/*//拷贝赋值函数
template<typename T,typename D>
myVector& myVector<T,D>::myVector &operator=(const myVector &other)
{
}*/
//判空
template<typename T,typename D>
bool myVector<T,D>::myVector_empty()
{
if(0==len)
{
return true;
}
return false;
}
//判满
template<typename T,typename D>
bool myVector<T,D>::myVector_full()
{
if(len==size)
{
return true;
}
return false;
}
//任意位置插入
template<typename T,typename D>
void myVector<T,D>::myVector_insert(D pos)
{
if(myVector_full())
{
T* buf=new T (size);
for(int i=0;i<size;i++)
{
*buf=*iterator;
buf++;
iterator++;
}
delete []iterator;
size=2*size; //二倍扩容
T* iterator=new T (size);
for(int i=0;i<size/2;i++)
{
*iterator=*buf;
buf++;
iterator++;
}
}
T i;
cout<<"请输入要插入的数据:";
cin>>i;
//后移
for(int j=len;j>=pos;j--)
{
iterator[j]=iterator[j-1];
}
for(int j=0;j<pos;j++)
{
iterator++;
}
*iterator=i;
len++;
cout<<"插入成功"<<endl;
return ;
}
//任意位置删除
template<typename T,typename D>
void myVector<T,D>::myVector_pop(D pos)
{
if(myVector_empty())
{
cout<<"已经是空容器了,没有元素可以删除了"<<endl;
return ;
}
//前移
for(int j=pos-1;j<len-2;j++)
{
iterator[j]=iterator[j+1];
}
len--;
cout<<"第"<<pos<<"位删除成功"<<endl;
return ;
}
//清空容器
template<typename T,typename D>
void myVector<T,D>::myVector_outall()
{
if(myVector_empty())
{
cout<<"已经是空容器了,不需要清空"<<endl;
return ;
}
/*
cout<<"开始清空队列"<<endl;
T temp=0;
for(;front!=tail;front=(front+1)%128)
{
temp=arr[front];
cout<<temp<<"出队成功"<<endl;
}
*/
len=0;
cout<<"清空队完成"<<endl;
return ;
}
//求容器的大小
template<typename T,typename D>
D myVector<T,D>::myVector_size()
{
return size;
}
//输出容器内所有元素
template<typename T,typename D>
void myVector<T,D>::myVector_show()
{
for(int i=0;i<len;i++)
{
cout<<iterator[i]<<endl;
}
}
int main()
{
//有参 构造
myVector<double,int> s(2,3.3);
s.myVector_show();
//s.myVector_insert(1);
return 0;
}