STL vector实现(一)

来源:互联网 发布:线上交易平台数据安全 编辑:程序博客网 时间:2024/06/05 04:34

  作者放弃对本文的任何权利。任何人都有权转载,修改,分发。转载请注明出处。作者对本文不承担任何责任。

  假定你现在已经能熟练使用vector,如果你很好奇vector背后是怎么实现的,那么本文或许对你能有所帮助。

  vector代表了c++的动态数组,大小是动态可增长的。你不必考虑自己手动分配或释放内存,也不必担心内存泄漏,vector帮你做了这一切。vector的使用很简单,但是要做到有效率,没那么容易,了解他背后的实现原理能帮助达到这一目的。

  言归正传。本文基于SGI STL的一个vector的实现,向大家讲述vector的实现思想和技术,如有不妥的地方,还请大家给出批评建议。(建议大家在阅读本文之前,先能温习一下vector的相关内容和用法)。

  让我们先看看类的声明和数据成员:

#include <alloc.h>  //内存分配器头文件,非标准

#include <iterator.h> //迭代器头文件,非标准

template <class T > //模板类声明,提供泛型功能。
class vector {
  typedef alloc Alloc;  //内存分配器typedef
public:
    typedef T value_type;  //值类型 T
    typedef value_type* pointer; // 指针类型 T*
    typedef value_type* iterator; //迭代器,这里的迭代器不需要封装,只是一个原生指针的typedef
    typedef const value_type* const_iterator; // 只读迭代器
    typedef value_type& reference;  //引用 T&
    typedef const value_type& const_reference;  //只读引用
    typedef size_t size_type;  //长度类型 size_t,一般是unsigned int;
    typedef ptrdiff_t difference_type; // 指针间隔,用来表示两个指针间的距离
    typedef reverse_iterator<const_iterator, value_type, const_reference,
                             difference_type>  const_reverse_iterator; //反向迭代器,定义在<iterator.h>
    typedef reverse_iterator<iterator, value_type, reference, difference_type>
        reverse_iterator; //只读反向迭代器
protected:

   //数据成员

    typedef simple_alloc<value_type, Alloc> data_allocator; //分配器的typedef
    iterator start; //vector的第一个元素的迭代器,用来表示vector,永远为vector.begin();
    iterator finish;  //vector的末尾,指向vector的最后一个元素的下一个位置。永远为vector.end();
    iterator end_of_storage; //vector所拥有的内存的末尾。如果等于vector.end(),表示vector已满

}

  从以上我们可以看到,vector用allocator来进行内存管理,用三个迭代器来引用这段内存。vector的iterator 其实就是T*的别名。我们知道在一个连续的内存里(数组),指针是可以做算术运算的,也支持[]操作,所以vector的iterator也支持算术运算,++,--,+=, -=,[],vector的迭代器就是通常的随机访问迭代器了。

  另外,我想说的是,STL有许多流行的版本,每一个版本实现都不是相同的,但是原理区别不大。vector的底层实现一般是连续的内存(数组)。deque的实现是连续的内存块,list的是双链表,set和map是红黑树。stack和queue都是这些容器的适配器(用这些容器来实现)。知道这些是很有必要的。

  下一篇文章里,将会讨论到vector的常用接口的实现。

 

 

原创粉丝点击