STL学习之Vector

  vector的数据安排及操作与array非常相似,两者唯一的差别在空间的运用方面,array是静态空间,vector是动态空间,随着元素加入,vector内部机制会自行扩展空间以容纳新元素。因此vector的运用对内存的合理利用有很大帮助。
 vector的实现技术,关键在于大小的控制以及重新分配时数据移动效率,SGI vector的空间分配策略,新元素插入时,首先检查是否还有备用空间,如果有直接在备用空间上构造元素,并调整迭代器finsh,使vector变大,如果没有备用空间,就扩充空间(重新配置,移动数据,释放原空间)。
所谓动态增加大小,不是在原空间之后接续新空间(因为无法保证原空间之后尚有可配置的空间),而是以原来大小的大小的两倍(有待考证)另外配置一块较大的空间,然后将原内容拷贝过来,然后才开始在原内容之后构造新元素,并释放原空间。因此,对vector的任何操作,一旦引起了重新分配,指向原vector的所有迭代器都失效了。
 vector维护的是一个连续的线性空间,任何元素都可以作为vector的迭代器而满足所有必要条件,vector所采用的数据结构非常简单,线性连续结构。有两个迭代器start,finish分别指向配置得来的连续空间中目前已被使用的范围,并以迭代器end_of_storage指向整个连续空间(含备用空间)的尾端。
template
class vectot{
.......
  interator start;    /////////////表示目前使用空间的头
 interator  end;    ////////////表示目前使用空间的尾
 interator end_of_storage ////表示目前可用空间的尾    
}

为降低空间配置的成本,vector实际配置的大小可能比客户端需求更大一些,以备将来可能的扩充,这便是容量(capacity)的概念。一个vector的容量永远大于或等于其大小。一旦容量等于大小,便是满载,下次再有新增元素,整个vector就另寻居所,扩充容量。
运用start、end、end_of_storage三个迭代器,便可轻易提供首尾部标示、大小、容量、空容器判断等功能。

你可能感兴趣的:(STL标准模版库)