最近我遇到这样一个问题
我在这希望在头插入多个4 但是我发现assert给我报了个错 说我的pos不在我规定的范围内,我这个纳闷了为啥出现这个呢 我的it不是++呢么而且也没有超过end啊。于是我就开始调试发现前两个都还是正常的,但到了第三个我发现:
这个it指向的值变成了随机值,结合上面的代码,我想到了 原因:在我不断头插的过程中容量由充足到扩容,扩容后就会重新new一段新的空间之前的就被delete了,我原来的it还是指向被delete的空间于是就产生了随机值而且地址大小和新地址大小也不匹配了。这就是迭代器失效了,我们可以用it接受push_back的返回值(iterator)这样it就会得到该位置最新的迭代器,就不会造成失效。
那么删除的时候会不会也有这种问题呢?其实要看是如何实现删除的,如果有缩容的算法,那么就会出现这种情况,毕竟也是要把原来的空间释放开一块新的空间。
结论:insert/erase pos的位置一定不要直接访问pos,因为你不知道他是不是容量变化了,要记得先去更新一下pos,不然就会出现迭代器失效等问题。
那么list下的迭代器也会像这样失效码?
答案是一定的。
我们知道list在扩容的时候是不会重新开辟空间扩容的,因此它在插入的算法中是不会有这种失效问题的,它只有在删除的时候才会出现,因为list的iterator是一个类,使用该节点的指针去构造它的,因此当你插入的时候你就是用插入节点的地址去构造这个迭代器 这个迭代器是不会失效的,当你删除时,你就会把这个节点的指针delete掉,当你再访问这个迭代器的时候,你就是在访问一个野指针。就会出现失效问题。因此list再使用删除操作的时候也要注意更新迭代器。避免出现失效。