第四章 vector实现

  自己写的vector比较简单,大概能满足一些需求,加深对vector的理解,代码在下面:
#include <iostream>
#include <memory>
using namespace std;
template <class T>
class Vector
{
private:
     allocator<T> alloc;//没有使用SGI提供的内存分配的方法,使用起来比较烦而且还没有头文件
public:
typedef T value_type;                 //内嵌类型 感觉traits没有完全体现出来
typedef value_type* pointer;
typedef value_type* iterator;
typedef value_type& reference;
typedef size_tsize_type;
typedef ptrdiff_tdifference_type;
protected:
iterator start;
iterator finish;
iterator end_of_range;
iterator allocate_and_fill(size_type n,const T& x)//分配内存空间
{
iterator result=alloc.allocate(n,NULL);
uninitialized_fill_n(result,n,x);
return result;
}
void fill_initialize(size_type n,const T & value)//初始化
{
start=allocate_and_fill(n,value);
finish=start+n;
end_of_range=finish;
}
public:
iterator begin()
{
return start;
}
iterator end()
{
return finish;
}
size_type size() const
{
return size_type (finish-start);//此处用end()-begin()有问题按照STL里面讲的话,错误显示类型转换错误
}
size_type capacity ()const
{
return size_type(end_of_range-start);
}
bool empty()
{
return begin()==end();
}
reference operator [](size_type n)
{
return *(begin()+n);
}
Vector():start(0),finish(0),end_of_range(0){}//下面是各种情况的构造函数
Vector(size_type n,const T&value)
{
fill_initialize(n,value);
}
Vector(int n,const T&value)
{
fill_initialize(n,value);
}
Vector(long n,const T& value)
{
fill_initialize(n,value);
}
explicit Vector(size_type n)
{
fill_initialize(n,T());
}
~Vector()
{
while(start!=finish)  //析构函数:释放空间和元素
{
alloc.destroy(--finish);
}
alloc.deallocate(start,end_of_range-start);
}
reference front()
{
return *begin();
}
reference back()
{
return *(end()-1);
}
void push_back(const T&x)  //这个写的比STL里面简单,没有使用insert函数,大概写了空间变为原来的两倍,并且没有实现插入函数
{
if (finish!=end_of_range)
{
alloc.construct(finish,x);
++finish;
}
else
{
size_type old_size=size();
size_type new_capactiy =(old_size !=0? 2*old_size:1);
iterator new_start=alloc.allocate(new_capactiy,NULL);
uninitialized_copy(start,finish,new_start);//其实直接使用copy就行,因为vector是RADOMITERATOR
while (start!=finish)
{
alloc.destroy(--finish);
}
if (start)
{
alloc.deallocate(start,size_type(end_of_range-start));
}
start=new_start;
finish=start+old_size;
end_of_range=start+new_capactiy;
alloc.construct(finish,x);
++finish;
}


}
void pop_back()
{
--finish;
alloc.destroy(finish);
}
iterator erase(iterator position)
{
if (position+1==end())//后面往前移动
{
copy(position+1,finish,position);
}
--finish;
alloc.destroy(finish);
return position;
}
void clear()//没有使用带有两个参数的erase自己循环了
{
while(start!=finish)
{
erase(--finish);
}
}
};
int main()//各个模块调用了一下没有什么问题
{
Vector<int>vi(3,10);
cout<<vi.front()<<endl;
cout<<vi.back()<<endl;
vi.push_back(1);
Vector<int>::iterator it=vi.begin();
vi.erase(it);
for (;it!=vi.end();++it)
{
cout<<*it<<" ";
}
cout<<endl;
cout<<vi.capacity()<<endl;
cout<<vi.size()<<endl;
cout<<vi.empty()<<endl;
cout<<"-------------------"<<endl;
vi.push_back(1);
vi.push_back(2);
it=vi.begin();
for (;it!=vi.end();++it)
{
cout<<*it<<" ";
}
cout<<endl;
cout<<vi.capacity()<<endl;
cout<<vi.size()<<endl;
cout<<vi.empty()<<endl;
return 0;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值