vector的实现

来源:互联网 发布:淘宝主图去同款 编辑:程序博客网 时间:2024/05/18 00:54

有了前面的基础后,我们知道对于特定的容器,我们一般要有对应的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));//释放内存

完整代码如下: