在利用iterator遍历vector并且删除其中一个元素的时候,发生了错误。
错误代码如下:
vector<int> vec = { 1, 3, 34, 44, 3, 5 };
for (vector<int>::iterator it = vec.begin(); it < vec.end(); it++) //erase以后执行it++报错
{
if (3 == *it)
{
cout << "find one" << endl;
vec.erase(it);
}
}
出错原因:
执行了erase操作之后,迭代器it失效。因为当前的迭代器it是一个无效的迭代器,故不可执行 it++操作;
修正代码:
vector<int> vec = { 1, 3, 34, 44, 3, 5 };
for (vector<int>::iterator it = vec.begin();it < vec.end();it++)
{
if (3 == *it)
{
cout << "find one" << endl; //第一步:找到了要删除的位置
auto temp = it; //第二步:删除后当前的it会失效。 所以可以定义一个临时变量
it--;
vec.erase(temp); //第三步:正确删除
}
}
---------------------------------分割线-----------------------------------------------------------------------------------------------
自己的猜测:
vector里的迭代的的实现可能类似链表,迭代器里面存储的元素包括前一个元素的地址,自己本身元素的地址,以及后面一个元素的地址。
如下: frontPointer selfPointer behindPointer
当执行erase操作时,就相当于执行了链表里面的删除操作。
比如:删除了第三个元素,那么更改了第二个元素的behindPointer和第四个元素的frontPointe。
并且把自己本身的的frontPointer selfPointer behindPointer都删除掉。
因此:当我们执行it++这个操作的时候,就相当于去访问垃圾内存。
erase的时候会不会把it本身的内存数据也删除了?
反驳:如果说iterator是一个类似链表结构的对象,那么如何解释 it++操作,*it操作?运算符重载?