仿照vector手动实现自己的myVector部分功能,最主要实现二倍扩容功能
#include <iostream>
using namespace std;
template <typename V>
class myVector
{
private:
V *data; //存放数据
int size; //数组长度
int capacity; //容量大小
public:
myVector():size(0),capacity(1)
{
data = new V[capacity];
cout<<"无惨构造"<<endl;
}
~myVector()
{
delete []data;
cout<<"析构函数"<<endl;
}
//判空
bool empty();
//返回指定的位置
V& at(int index);
//尾插
void push_back(int value);
//尾删
void pop_back();
//任意位置插入
void insert(int pos,const V &value);
//当前元素个数
int get_size();
//二倍扩容
int expandCapacity();
};
//判空
template <typename V>
bool myVector<V>::empty()
{
return size==0;
}
//当前元素的个数
template <typename V>
int myVector<V>::get_size()
{
return size;
}
//二倍扩容
template <typename V>
int myVector<V>::expandCapacity()
{
capacity *= 2;
V *newdata = new V[capacity]; //定义一个新的指针指向原来的空间
for(int i=0;i<size;i++)
{
newdata[i] = data[i];
}
delete []data; //将原来的空间释放掉
data = newdata; //再把原来的指针更新为newdata,并且data指向了新的空间
return capacity;
}
//尾插
template <typename V>
void myVector<V>::push_back(int value)
{
if(size>=capacity)
{
expandCapacity(); //调用一次二倍扩容
}
data[size] = value;
size++;
}
//尾删
template <typename V>
void myVector<V>::pop_back()
{
if(size>0)
{
size--;
}
}
//返回指定的位置
template <typename V>
V& myVector<V>::at(int index)
{
if(index<0||index>=size)
{
throw V(1);
}
return data[index];
}
//任意位置插入
template <typename V>
void myVector<V>::insert(int pos,const V &value)
{
if(pos<0||pos>size)
{
throw V("pos");
}
if(size>=capacity)
{
expandCapacity(); //调用一次二倍扩容
}
for(int i=size;i>pos;i--)
{
data[i+1] = data[i]; //整体后移
}
data[pos] = value;
size++;
}
int main()
{
int i;
myVector<int> v1;
cout<<v1.empty()<<endl; //1
v1.push_back(80);
v1.push_back(90);
v1.push_back(5);
for(i=0;i<static_cast<int>(v1.get_size());i++)
{
cout<<v1.at(i)<<" ";
}
cout<<endl;
cout<<v1.empty()<<endl;
cout<<"v1.cap = "<<v1.expandCapacity()<<endl;
v1.push_back(80);
v1.push_back(90);
v1.push_back(5);
cout<<"v1.cap = "<<v1.expandCapacity()<<endl;
return 0;
}