stl源码剖析之vector

vector是一种序列式容器,使用vector时只需要#include <vector>
sgi stl 3.0中vector的具体实现定义在stl_vector.h文件中,vector使用的是连续线性空间,vector的迭代器即为普通指针,截取sgi stl 3.0部分源码,如下

//alloc是第一级或第二级配置器,定义在<stl_alloc.h>中,sgi stl中alloc默认为第二级配置器
template <class T, class Alloc = alloc>  
class vector {
public:
//定义类型别名
  typedef T value_type;
  typedef value_type* pointer;
  typedef const value_type* const_pointer;
  typedef value_type* iterator;    //vector维护的是连续线性空间,以普通指针作为vector的迭代器
  typedef const value_type* const_iterator;//const_iterator指向常量,即指针可变,指向的内容不可变
  typedef value_type& reference;   //引用
  typedef const value_type& const_reference;
  typedef size_t size_type;
  typedef ptrdiff_t difference_type;

#ifdef __STL_CLASS_PARTIAL_SPECIALIZATION
  typedef reverse_iterator<const_iterator> const_reverse_iterator;  //反向迭代器,reverse_iterator是一个template,定义在<stl_iterator.h>
  typedef reverse_iterator<iterator> reverse_iterator;
#else /* __STL_CLASS_PARTIAL_SPECIALIZATION */
  typedef reverse_iterator<const_iterator, value_type, const_reference, 
                           difference_type>  const_reverse_iterator;
  typedef reverse_iterator<iterator, value_type, reference, difference_type>
          reverse_iterator;
#endif /* __STL_CLASS_PARTIAL_SPECIALIZATION */
protected:
  typedef simple_alloc<value_type, Alloc> data_allocator;  //simple_alloc定义在<stl_alloc.h>中,用以分配内存
  iterator start;    //目前使用空间的头
  iterator finish;   //目前使用空间的尾
  iterator end_of_storage;  //目前可用空间的尾
};

可以看到sgi stl中以普通指针(T*)作为迭代器,vector维护线性空间,以普通指针作为迭代器可以支持它的快速移动以及vector的随机存取。当vector原空间大小不足时,vector需要申请更大的空间,并将原空间中所有元素移动到新空间,并销毁释放原空间。由此可知,vector扩容时,消耗很大,因此,vector申请空间时一般先申请比客户端需求更大的空间,防止频繁的申请空间。vector维护三个迭代器,分别指向当前使用空间的头,当前使用空间的尾,可用空间的尾。
这里写图片描述

template <class T, class Alloc = alloc>  
class vector {
public:
  iterator begin() { return start; }
  const_iterator begin() const { return start; }
  iterator end() { return finish; }
  const_iterator end() const { return finish; }
  reverse_iterator rbegin() { return reverse_iterator(end()); }
  const_reverse_iterator rbegin() const { 
    return const_reverse_iterator(end()); 
  }
  reverse_iterator rend() { return reverse_iterator(begin()); }
  const_reverse_iterator rend() const { 
    return const_reverse_iterator(begin()); 
  }
  size_type size() const { return size_type(end() - begin()); }
  size_type max_size() const { return size_type(-1) / sizeof(T); }
  size_type capacity() const { return size_type(end_of_storage - begin()); }
  bool empty() const { return begin() == end(); }
  reference operator[](size_type n) { return *(begin() + n); }
  const_reference operator[](size_type n) const { return *(begin() + n); }
};

vector的部分构造函数:

template <class T, class Alloc = alloc>  
class vector {
public:
  vector() : start(0), finish(0), end_of_storage(0) {}   //空的vector
  vector(size_type n, const T& value) { fill_initialize(n, value); } //vector大小为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(const vector<T, Alloc>& x) {
    start = allocate_and_copy(x.end() - x.begin(), x.begin(), x.end());
    finish = start + (x.end() - x.begin());
    end_of_storage = finish;
  }

protected:
  iterator allocate_and_copy(size_type n,
                             const_iterator first, const_iterator last) {
    iterator result = data_allocator::allocate(n);  //分配空间
    uninitialized_copy(first, last, result);  //将迭代器[first,last)之间的内容拷贝到result开始的空间
    return result;
  }
 iterator allocate_and_fill(size_type n, const T& x) {
   iterator result = data_allocator::allocate(n);
   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_storage = finish;
 }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值