vector的实现

有了前面的基础后,我们知道对于特定的容器,我们一般要有对应的iterator与之对应,因为不同的容器,对应不同的数据结构,不同的数据结构对应不同的存取方式,所以也对应了不同的iterator类型。

我们知道vector容器对应的iterator肯定是 std::random_access_iterator_tag 类型的,它代表这种迭代器可以随机访问。

所以跟前面一样我们的迭代器首先应该实现 相应类型接口:

public:
 typedef typename T                     value_type;
 typedef typename ptrdiff_t      difference_type;
 typedef typename T&                    reference;
 typedef typename T*                    pointer;
 typedef typename std::random_access_iterator_tag  iterator_category;

然后就是重载一些操作符了,尽量让它的操作与指针的操作相符合,所以我们必须首先一下操作符的重载:

++(前),++(后)

--(前),--(后)

+(int n) -(int n)

-(iterator iter)

*       ->

所以有了这些要求后我们的迭代器就可以按如下实现了:

然后就是vector的实现了:

首先我们要确认它提供哪些接口,一般来说,对于线性存储的,对应有:

push_back,pop_back,front,back,at,operator[],empty,size。这些基本的操作,插入,删除,随机访问,清空,得到元素的数量。

但是我们还有一点要记住,因为vector跟array不一样,vector可以实现智能增长,所以我们一般需要下面3个成员来记录vector的状态:

iterator  start;//指向第一个元素

iterator  finish;//指向最后一个元素的后一个元素

iterator end_of_storage;//指向容器的末尾。

当finish==end_of_storage时候就代表空间满了,需要重新分配一个更大的空间.

所以这个时候必须还要提供一个 私有的函数用于分配空间。

在这里仿照书上写的,我用insert_aux()这个函数全权完成了。在这个函数里面实现内存的分配和释放:

new_start=(T*)__my_default_alloc_template<0,0>::allocate(sizeof(T)*capacity);//分配内存

__my_default_alloc_template<0,0>::deallocate(start,(end_of_storage-start)*sizeof(T));//释放内存

完整代码如下:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值