vector实现
typedef int size_type; /* vector维护的是一个连续线性空间,提供的迭代器是Random Access Iterators即普通指针 */ template <class T,class Alloc=alloc> class vector { protected: iterator start;//目前使用空间的头 iterator finish;//目前使用空间的尾 iterator end_of_storage;//目前可用空间的尾 public: void push_back(const T& x); void insert_aux(iterator position, const T& x); int size()const{ return int(end() - begin()); } }; /* vector动态增加大小,并不是在原空间之后开辟新空间,因为无法保证原空间之后尚有可供配置的空间,而是以 原大小的两倍另外配置一块较大空间,然后将原内容拷贝过来,然后才开始在原内容之后构造新元素,并释放原空间 */ template<class T,class Alloc=alloc> void vector::push_back(const T& x) { if (finish != end_of_storage) { construct(finish, x); ++finish; } else//已无备用空间 insert_aux(end(), x); } template<class T, class Alloc = alloc> void vector<T, Alloc>::insert_aux(iterator position, const T& x) { const size_type old_size = size(); const size_type len = old_size != 0 ? 2 * old_size : 1; /* 配置原则:若原空间大小为0,则配置一个元素大小,否则配置原大小的两倍 前半段用来放置原数据,后半段用来放置新数据 */ //data_allocator为vector专有的空间配置器 iterator new_start = data_allocator::allocate(len); iterator new_finish = new_start; //将原vector的内容拷贝到新vector new_finish = uninitialized_copy(start, position, new_start); //为新元素设定初值x construct(new_finish, x); ++new_finish; //析构并释放原vector destroy(begin(), end()); deallocate(); //调整迭代器 start = new_start; finish = new_finish; end_of_storage = new_start + len; }