1、 vector概述
vector是动态空间,随着元素的加入,它内部机制会自行扩充空间以容纳新元素。
vector的实现技术,关键在于其对大小的控制及重新配置时的数据移动效率。
2、 vector的迭代器
vector的迭代器是普通指针,支持随机存取,提供的是Random Access Iterators。
template<class T, class Alloc = alloc> class vector{ public: typedef T value_type; typedef value_type* iterator;//vector的迭代器是普通指针 ... };
3、vector的数据结构:
vector采用的数据结构是线性连续空间。以两个迭代器start和finish分别指向配置得来的连续空间中目前已被使用的范围,并以迭代器end_of_storage指向整块连续空间(含备用空间)的尾端。
template<class T,class Alloc = alloc> class vector{ ... protected : iterator start ; //表示目前使用空间的头 iterator finish ; // 表示目前使用空间的尾 iterator end_of_storage ; //表示目前可用空间的尾 };
一个vector的容量永远大于或等于其大小,当容量等于大小时,再增加新元素,便要进行重新配置,移动数据和释放原空间3个过程。
4、push_back()函数
void push_back() { if (finish != end_of_storage) {//还有备用空间 construct(finish); ++finish; //调整迭代器finish } else//没有备用空间 insert_aux(end(), x); } template<class T, class Alloc> void vector<T, Alloc>::insert_aux(iterator position, const T&x){ if (finish != end_of_storage){//还有备用空间 construct(finish, *(finish - 1)); //在备用空间起始处构造一个元素,以vector最后一个元素值为其初值 ++finish; //调整finish迭代器 T x_copy = x; copy_backward(position, finish - 2, finish - 1); *position = x_copy; } else{//没有备用空间 const size_type old_size = size(); const size_type new_size = old_size != 0 ? 2 * old_size : 1; iterator new_start = data_allocator::allocate(new_size); iterator new_finish = new_start; try{ new_finish = uninitialized_copy(start, position, new_start);//将原vector的内容拷贝到新vector construct(new_finish, x); ++new_finish; new_finish = uninitialzed_copy(position, finish, new_finish);//将安插点的原内容也拷贝过来 } catch (excetion e){ destroy(new_start, new_finish);//如果发生异常,析构移动的元素,释放新空间 data_allocator::deallocate(new_start, new_size); }//析构并释放原空间 destroy(begin(), end()); deallocator(); start = new_start; //调整迭代器 finish = new_finish; end_of_storage = new_start + new_size;//调整迭代器 } }用push_back()函数将新元素插入于vector尾端时,首先检查是否有备用空间,有的话直接在备用空间构造元素并调整迭代器finish,如果没有的话就扩充空间(重新配置,移动数据和释放原空间3个过程),指向原vector的所有迭代器都失效。见图4-2。
5、pop_back()函数
void pop_back(){ --finish; destory(finish); }
用pop_back()函数将尾元素删除时,首先将迭代器finish前移一格,再用destroy()函数销毁尾元素。
6、erase()函数
iterator erase(iterator first,iterator last){//清除区间[first,last)的元素 iterator i=copy(last,finish,first); destroy(i,finish); finish=finish-(last-first); return first; } iterator erase(iterator position){ //清除某个位置上的元素 if(position +1!=end()) copy(position+1,finish,position); --finish; destroy(finish); return position; }
7、insert()函数