迭代器的主要作用就是让算法能够不用关心底层数据结构,其底层实际就是一个指针,或者是对指
针进行了封装,比如:vector的迭代器就是原生态指针T* 。因此迭代器失效,实际就是迭代器底层
对应指针所指向的空间被销毁了,而使用一块已经被释放的空间,造成的后果是程序崩溃(即如果
继续使用已经失效的迭代器, 程序可能会崩溃)。
此时的resize引起了vector的扩容,那么原本的迭代器就会失效,因为it还是使用的扩容前的旧空间,打印的时候就是使用的就空间,导致运行的崩溃。类似的操作还有reserve、insert、erase、assign等。
解决方式是,在更新新的空间后重新给迭代器it赋值。
一般而言erase不会导致失效,但是当pos的位置是最后一个元素时,删除了pos位置的元素,pos
就失效了,此时打印pos位置失败。因此删除vector中任意位置上元素时,vs就认为该位置迭代器
失效了。
可以看到当a.erase(it)的时候,迭代器又失效了,因为空间的变化导致it没有更新,所以无法完
成后续的代码。
此时把it++放在else的外面又会报错,因为it更新后的位置就是下一个元素的位置,所以不能把
it++放在条件判断的后面,比如在最否erase(6)的时候,it++会导致越界。
此时程序的运行没有问题。
在linux迭代器问题汇总:
1. 扩容之后,迭代器已经失效了,程序虽然可以运行,但是运行结果已经不对了。
2. erase删除任意位置代码后,linux下迭代器并没有失效。因为空间还是原来的空间,后序元素往
前搬移了,it的位置还是有效的。
3: erase删除的迭代器如果是最后一个元素,删除之后it已经超过end。此时迭代器是无效的,++it
导致程序崩溃。
与vector类似的是,string的插入扩容和erase删除数据也会导致迭代器的失效。
所以需要对迭代器重新赋值。