今天的写代码时遇到了类似的问题
#include<vector>
#include<iostream>
using namespace std;
int main()
{
vector<int>ar;
for(int i = 1; i<=5; i++)
{
ar.push_back(i);
}
vector<int>::iterator it = ar.begin();
while(it != ar.end())//迭代器失效
{
if(*it == 1)
{
ar.erase(it);
}
else
{
it++;
}
}
return 0;
}
这段代码看似没有问题,但是在删除的时候造成了迭代器失效。
通过查阅资料,在《c++标准程序库》第六章STL容器中,指明了发生vector迭代器失效的两种情况。
1.使用者在一个较小索引位置上安插和移除操作;
2.由于容量发生变化而引起的内存分配。
对于第一条:在插入或删除的位置以后,迭代器失效。不难理解,由于顺序存储的连续性,插入或删除操作使得操作位置之后的数据发生移动,每个位置的数据已经不是原来的数据,引起迭代器失效。
对于第二条:当容器内数据放满时,再次加入数据必然要进行扩容。vector的扩容需要重新申请内存,而将原内存释放,这就造成了原内存上的迭代器失效。