vector 心得

本文详细探讨了C++中vector的erase、resize和reserve操作。erase会导致迭代器失效;resize在增加vector大小时会初始化新元素,而push_back可能导致迭代器失效;reserve仅扩大容量,不改变元素数量,且不会导致迭代器失效。在尾部添加元素时,push_back在容量充足时的效率优于resize(resize()+1)。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

earse

earse时整个数组向前移所以在vector上的迭代器都失效,故需每个迭代器–it下才能正常使用。
resize(nums),实际vector的有效元素变为nums个并初始化为0。这时再push_back就在nums后面插入了。
push_back ,insert 可能造成迭代器失效

resize

  resize 比当前容量大时,底层重新申请内存,所以迭代器也会失效

reserve

  reserve只能扩大不能扩小,当小于等于当前容量时,函数会相当于没有调用,如果我们想释放多余vector容量

  1. 定义一个tmp vector,然后使用vector的 swap函数交换下即可
  2. 使用c++11的专门释放内存的函数
关于push_back

  push_back的时候,会判断当前容量是否足够,不足够会申请一段新的空间,然后把原先的元素(size大小的所有元素)通过 inplacement new 的copy构造的方式拷贝到新空间上,然后再把尾插的元素也以inplacement new 的方式构造到新的空间处。如果空间足够,使用就在finish指针指向的空间调用 inplacement new 以 copy构造的方式构造新的对象。所以它的push_back 是均摊的O(1) 。

construct

  vector v(100) ,它会生成一个有效元素为100个的vector,并且每个元素内容都是T()的内容。所以这个参数n指的是有效元素个数而并非容量。如果想提高push_back的效率,不想边插边扩容,可以考虑reserve。

reserve

  reserve会把原先的有效元素(SIZE)构造到新空间,然后容量扩充为新申请空间大小。它跟resize最大区别在于它比resize性能更高。如果你想扩容,你调的是resize ,那么vector不止会申请你想要的内存,还会调用 inplacement new 来初始化这段空间,而reserve只申请空间

尾插论 resize(resize()+1) 与 push_back(T()) 效率

  当我们有的时候想往vector尾插一个默认元素的时候,可以resize(resize+1) 与 push_back(T()) 。在size大小小于容量的情况下, resize 会拿你传入的大小和对象去初始化内存,如果你没有传入那么默认是T(),因为它是值传递所以必定发生一次copy。开始的时候resize 会把最后一个元素copy到end处,然后再把传入的value再诺到end+1出发生了3次copy。而push_back 根据置位new来copy只发生1次。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值