首页 > 代码库 > STL源码--vector(一)
STL源码--vector(一)
一、vector的特性
vector其中一个特点:内存空间只会增长,不会减小,援引C++ Primer:为了支持快速的随机访问,vector容器的元素以连续方式存放,每一个元素都紧挨着前一个元素存储。设想一下,当vector添加一个元素时,为了满足连续存放这个特性,都需要重新分配空间、拷贝元素、撤销旧空间,这样性能难以接受。因此STL实现者在对vector进行内存分配时,其实际分配的容量要比当前所需的空间多一些。就是说,vector容器预留了一些额外的存储区,用于存放新添加的元素,这样就不必为每个新元素重新分配整个容器的内存空间。
二、vector的操作
vector的迭代器就是普通指针;数据结构就是线性的连续空间。
push_back:在调用push_back时,每次执行push_back操作,相当于底层的数组实现要重新分配大小;这种实现体现到vector实现就是每当push_back一个元素,都要重新分配一个大一个元素的存储,然后将原来的元素拷贝到新的存储,之后在拷贝push_back的元素,最后要析构原有的vector并释放原有的内存
clear:
对于STL中的vector调用clear时,内部是如何操作的?若想将其内存释放,该如何操作?
由于对象的指针不是内建对象,所以进行遍历析构。
for ( ; first <last; ++first) //遍历元素进行析构
destroy(&*first); //!!!!!关键句!!!!!!!!!
*iterator是元素类型,&*iterator是元素地址,也就是一个指针。之后调用&*iterator->~T();所以可知当vector中所存储的元素为对象的时候,调用clear()操作的时候系统会自动调用析构函数。但是当存储元素是指针的时候,指针指向的对象就没法析构了。因此需要释放指针所指对象的话,需要在clear操作之前调用delete。
for(i= 0; i < vItem.size();i++)
delete vItem[i];
参考:
http://www.cnblogs.com/biyeymyhjob/archive/2012/09/12/2674004.html
http://blog.csdn.net/sicofield/article/details/8769612