在SGI STL中,vector使用的是连续的内存空间,迭代器使用普通指针来实现。
因为使用的是连续的内存空间,在vector容量不足的时候会直接分配一块新的内存,把原来的元素copy进去,回收原来的内存空间。
因此在vector扩容的时候,原来的所有迭代器都会失效。
vector的实现基本都是围绕这start、end、end_of_storage三个指针,首先先看看vector的基本定义
1 template <class T, class Alloc = alloc> 2 class vector { 3 public: 4 // 基本型别定义 5 typedef T value_type; 6 typedef value_type* pointer; 7 typedef value_type* iterator; 8 typedef value_type& reference; 9 typedef size_t size_type; 10 typedef ptrdiff_t difference_type; 11 protected: 12 // 空间配置器 只是对Alloc的进一步封装 13 typedef simple_alloc<value_type, Alloc> data_allocator; 14 // 关键的几个迭代器 15 iterator start; 16 iterator finish; 17 iterator end_of_storage; 18 public: 19 vector() : start(0), finish(0), end_of_storage(0) {} 20 // 回收内存 21 void deallocate() { 22 if (start) data_allocator::deallocate(start, end_of_storage - start); 23 } 24 ~vector() { 25 destroy(start, finish); // 对[start, finish)的元素调用相应的析构函数(如果是POD类型则什么都不做) 26 deallocate(); 27 } 28 // 提供简单的接口 29 iterator begin() { return start; } 30 iterator end() { return finish; } 31 size_type size() const { return size_type(end() - begin()); } 32 size_type max_size() const { return size_type(-1) / sizeof(T); } 33 size_type capacity() const { return size_type(end_of_storage - begin()); } 34 bool empty() const { return begin() == end(); } 35 reference operator[](size_type n) { return *(begin() + n); } 36 };