vector使用上的细节一览

本文是写给那些,会使用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. 依据当前对象的个数,重新申请更大的内存空间(依据不同的编译器,可能为当前对象的1.5倍或者2倍);

  2. 将旧内存空间中的数据,按原有顺序移动到新的内存空间中(拷贝);

  3. 将旧的内存空间释放。

这也就解释了,为什么 vector 容器在进行插入后,与其相关的指针、引用以及迭代器可能会失效的原因。原先指向的空间已经

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值