在写一个游戏时发现的。
使用vector保存一组元素,然后在一个for循环中使用迭代器iterator并调用erase删除指定的元素,但是在测试时总是出错。
上网查了下资料说是VS在erase(iter)后禁止对iter的解引用
自己测试了下发现只有在iter在调用erase之前指向为erase删除的位置或者之后的位置,再在调用erase(iter)后引用iter才是错误的。
类似这样的代码.
iter=vector.begin()+5;
iter1=vector.begin()+3;
vector.erase(iter1);
*iter;//报错
或者
vector.erase(iter)
*iter;//报错
在erase之后以下做法是对的
iter在erase之前赋值为erase删除的位置之前的值,在erase之后解引用是允许的
或者在erase之后对iter重新赋值均将是正确的
类似这样的代码均可以
iter=vector.begin()+5;
iter1=vector.begin()+8;
vector.erase(iter1);
*iter;//正确
或者
iter=Vector.erase(iter)
*iter;//正确
或者
iter=vector.begin()+i;
*iter;//正确
貌似可以这样认为:erase(iter)之后vector在iter位置以及之后的元素均被重新分配空间,因此使用在erase之前指向这段空间的iterator均将报错。
使用vector保存一组元素,然后在一个for循环中使用迭代器iterator并调用erase删除指定的元素,但是在测试时总是出错。
上网查了下资料说是VS在erase(iter)后禁止对iter的解引用
自己测试了下发现只有在iter在调用erase之前指向为erase删除的位置或者之后的位置,再在调用erase(iter)后引用iter才是错误的。
类似这样的代码.
iter=vector.begin()+5;
iter1=vector.begin()+3;
vector.erase(iter1);
*iter;//报错
或者
vector.erase(iter)
*iter;//报错
在erase之后以下做法是对的
iter在erase之前赋值为erase删除的位置之前的值,在erase之后解引用是允许的
或者在erase之后对iter重新赋值均将是正确的
类似这样的代码均可以
iter=vector.begin()+5;
iter1=vector.begin()+8;
vector.erase(iter1);
*iter;//正确
或者
iter=Vector.erase(iter)
*iter;//正确
或者
iter=vector.begin()+i;
*iter;//正确
貌似可以这样认为:erase(iter)之后vector在iter位置以及之后的元素均被重新分配空间,因此使用在erase之前指向这段空间的iterator均将报错。