std::vector的erase的问题

时间:2021-08-27 19:52:59

在利用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操作?运算符重载?