简介:
迭代器(iterator)是一种用来访问容器的工具(其底层就是一个指针、或者是一个被封装的指针),对于每种容器,STL都会提供对应的迭代器,而我们对这些容器内容的访问,就转变成对迭代器的遍历,进而实现对于不同容器内元素的访问方式统一
失效:
当用迭代器访问了某个元素并进行了某种操作后,这个迭代器(指针)访问的空间被销毁了,如果继续对其进行访问,则会导致程序崩溃。这种情况就称为迭代器失效
迭代器失效的原因是因为底层空间的变化,如
1、一些可能会导致扩容的函数:
resize、reserve、insert、push_back...
以上函数皆有可能导致空间的扩容,其失效的主要原因是:本地空间被释放
上图中:
it_before是在空间发生变化前的迭代器,指向变化之前的空间位置
it_after是空间发生扩容后的迭代器,通过调试发现其和it_before指向的位置不一样,这就是发生了迭代器的失效,此时如果还用旧的迭代器去访问,程序就会崩溃
2、一些删除操作:
erase
erase操作执行后,这个迭代器会指向被删除元素的下一个元素
此类删除操作看似没有问题,但是如果erase删除的是最后一个元素,那么下一个元位置就是end(),再对end()进行访问,程序就会崩溃( 因为 begin() 和 end() 是左闭右开,所以end()位置是非法位置 )
上图中:v中只有一个元素,而删除该元素后,it顺位指向了end()位置,而对该位置访问是非法的,所以程序就会崩溃
1、当存在容器容量的变化时,应确保迭代器及时更新。可在每一次更改容量后都使迭代器重新指向容器
2、由于STL大部分使用迭代器的接口的返回值都是迭代器,所以可以在每一次进行操作之后用返回值对迭代器重新赋值,如下: