迭代器失效就是迭代器指向的位置已经不是原来的含义了,或者是指向的位置是非法的。以下是失效的几种情况:
删除元素:
此处发生了迭代器的失效,因为erase返回的是下一个元素的位置的迭代器,所以在删除1这个元素的时候,迭代器已经指向了下一个元素。而for循环体内还有一次it++,所以此时it的位置在3。不是预期的2,所以2被忽略了,后面的4同理。可以这样修改:
像list/map这样的非连续内存的容器,它们不像vector那样删除元素后会移动元素。所以这样写会导致迭代器失效:
这样修改:
或者:
插入元素:
当元素个数大于vector容器总容量时,会发生扩容,而扩容一般都是进行的深拷贝,即在另一块内存开辟空间并依次赋值。所以之前那个空间的迭代器就失效了,可以这样修改:
把迭代器重新赋值即可。
排序:
排序也会导致迭代器失效,虽然不会报错但是输出结果也与我们预想的不同。 可以这样修改:
ps:
std::unordered_map::rehash()也会导致迭代器失效。因为unordered_map 的 rehash 函数可以用来手动调整哈希表的桶大小。 在 rehash 函数被调用时,unordered_map 会生成一个比原来桶数量更大的素数,然后将哈希表重新映射到新的桶中。