C++11迭代器失效问题分析

C++11迭代器失效问题分析

前言

这个问题面试官最喜欢问了,咱们把它解决掉,非常简单的。

顺序容器

  1. 对于序列式容器(如vector,deque),序列式容器就是数组式容器,删除当前的iterator会使后面所有元素的iterator都失效。这是因为vetor,deque使用了连续分配的内存,删除一个元素导致后面所有的元素会向前移动一个位置。所以不能使用erase(iter++)的方式,还好erase方法可以返回下一个有效的iterator。
    但是erase方法可以返回下一个有效的iterator。也就是说,别光顾着删除,记得保存一下下一个有效iter。
    另外,这还不是所有的原因,删除操作让迭代器失效的另一个原因我放在插入操作一起讲了。
    2.顺序容器的插入操作也是会让迭代器失效的。别只从删除的角度理解它对后面迭代器的影响,咱们从一个新的角度考虑。
    本身呢,vector在创建的时候是会分配一段固定大小的线性地址给你,所以并不是每次你push_back都会申请内存,那样的话就爆炸了呀。当你用光了先前那段内存后,vector要怎么做呢?很简单,它会重新申请一段更长的空间,然后把旧的数据拷贝过去,再把旧的数据销毁掉。执行删除操作的时候也有同样的反向操作,vector可能会自动缩小内存。那么你原先的迭代器还能行么?

关联容器

这个就舒服多了,放心删除好了,没关系的,只是被删除节点的迭代器会失效,对其他的不会产生影响的。

猜你喜欢

转载自blog.csdn.net/weixin_44039270/article/details/106738756
今日推荐