本文是写给那些,会使用vector,但是对vector的细节,了解不多的人。所以对于vector基本的操作如insert(),push_back(),emplace(),begin(),clear(),此处不再解释。本文重点介绍:vector的结构,vector的动态扩容机制,vector的使用场景,还有一些注意事项。
vector的结构:
vector即动态数组,它的动态,基于它的动态扩容机制。本质上它还是一个数组,是连续存储在内存空间中的,他在内存中的结构如下:
图2 vector 的三个指针,分别指向vector的三处关键节点
vector内部有三个迭代器维护着vector的缓存区域:
-
_M_start:它指向vector缓存区的第一个对象。
-
_M_finish:它指向vector缓存区中已插入的最后一个对象的下一个内存块。
-
_M_end_of_storage,它指向vector缓存区的末端(指向的是已分配内存的下一个块)。
vector扩容,获取大小,获取容量,判空,这些基础操作,都是根据这三个迭代器设计的。
_M_finish和 _M_end_of_storage指向的内存块是一样的时候,就会触发内存扩容。
vector的动态扩容:
_M_finish和 _M_end_of_storage指向的内存块是一样的时候,也就是当 vector 的大小和容量相等(size==capacity)时,再向其添加对象,那么 vector 就需要扩容。vector 容器扩容的过程需要经历以下 3 步:
-
依据当前对象的个数,重新申请更大的内存空间(依据不同的编译器,可能为当前对象的1.5倍或者2倍);
-
将旧内存空间中的数据,按原有顺序移动到新的内存空间中(拷贝);
-
将旧的内存空间释放。
这也就解释了,为什么 vector 容器在进行插入后,与其相关的指针、引用以及迭代器可能会失效的原因。原先指向的空间已经