所谓迭代器失效,是指迭代器已经不是指向原来的位置,这总是出现在需要连续存储的容器中,如:vector,deque,string。
拿vector来说,当需要插入或者删除元素时,如果原来的容量(capacity)不足以满足插入的需求,则必须重新分配一块内存,然后将vector对象中所有元素都搬新家,这必然会导致所有元素的迭代器都会发生变化(即原来迭代器失效)。这和动态数组是一样的。
例如:
#include <iostream>
#include <vector>
using namespace std;
int main()
{
vector<int> a{1,2,3,4};
int i=0;
vector<int>::iterator beg=a.begin(),end=a.end();
for( ;(beg+i)!=end; i++)
cout<<*beg+i<<" ";
cout<<endl;
a.insert(beg,9);
// beg=a.begin(),end=a.end(); //若注释这一行,则因为插入,需要重新申请内存,所以最后用来存储
//新的a数组的内存已经发生改变,则此时的a.begin()获得的迭代器已经不是开始时候的那个了
i=0;
for( ;(beg+i)!=end; i++) //所以如果继续这样使用,beg所指向则是一块已经被释放的内存的起始位置
//即beg已经是野指针了(注意,迭代器是广义的指针概念,但和一般的指针有所区别,可以用sizeof验证)
cout<<*(beg+i)<<" ";
cout<<endl;
return 0;
}