【STL基础】vector底层实现&vector迭代器失效

vector底层实现

  • 三个指针 _Myfirst、_Mylast、_Myend分别指向容器起始字节位置 容器最后一个内容字节位置 容器所占用内存空间尾部位置。

  • 在此基础上,将 3 个迭代器两两结合,还可以表达不同的含义,例如:
    _Myfirst 和 _Mylast 可以用来表示 vector 容器中目前已被使用的内存空间;
    _Mylast 和 _Myend 可以用来表示 vector 容器目前空闲的内存空间;
    _Myfirst 和 _Myend 可以用表示 vector 容器的容量。

  • 对于空的 vector 容器,由于没有任何元素的空间分配,因此 _Myfirst、_Mylast 和 _Myend 均为 null。

迭代器失效

vector 容器扩容的过程需要经历以下 3 步:

  1. 完全弃用现有的内存空间,重新申请更大的内存空间;
  2. 将旧内存空间中的数据,按原有顺序移动到新的内存空间中;
  3. 最后将旧的内存空间释放。

所以重新申请内存,容器内存地址发生变化,迭代器可能会失效,由于扩容十分复杂费时,为了省时,会申请比所需内存(size)更大的capacity。

避免 vector 容器执行不必要的扩容操作的关键在于,在使用 vector 容器初期,就要将其容量设为足够大的值。换句话说,在 vector 容器刚刚构造出来的那一刻,就应该借助 reserve() 成员方法为其扩充足够大的容量。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值