迭代器失效:该迭代器不再表示任何元素,即该迭代器已经不表示任何元素。
何时发生:处理vector,string,deque时,如果进行添加和删除操作就会导致迭代器失效,因为可能回引起内存空间的重新分配。
《C++ Primer》中总结如下:
(1)添加元素后:
- 容器是vector或string时,如果存储空间重新分配,之前指向容器的迭代器、指针和引用都会失效;如果没有重新分配,插入位置之前的迭代器、指针和引用都有效,插入位置之后的失效
- 容器是deque,插入到除首尾位置之外的任何位置都会导致迭代器、指针和引用失效;在首尾添加,则迭代器失效,指向存在的元素的指针和引用不会失效
注意:关于添加元素,由于 vector和string是采用的连续的内存段存储,如果添加元素没有重新分配空间(添加以后capacity没有改变),就会导致添加位置以后的元素的位置都要后移,这样就会导致迭代器失效,同时指针和引用也失效;而如果添加以后capacity发生改变,即重新分配内存空间,则所有的迭代器,指针和引用都会失效
对于deque,根据stl源码中的剖析,插入在中间位置时,程序会去比较插入位置之前的元素个数和位置之后的元素个数,如果插入之前的较少,则把插入位置之前的元素进行前移,反之,则后移,这样的话就会导致迭代器失效(如果是这样的话,迭代器的失效问题是不是要根据插入位置来判断?如果是进行前移,位置之后的迭