可能有不少人用Vector时,没太注意其iterator的用法,当Vector中的元素个数改变时,会引起iterator的一些error,看看下面代码,体会一下,会令你豁然开朗的
void main()
{
}
咋一看,这不是和上面提到的第一种方法一样吗?貌似没有问题啊。可是,要注意到,调用erase后,回到for循环又继续使用迭代器,并执行++运算。
好,让我们再温习一下erase函数的说明:
iterator erase ( iterator position );
iterator erase ( iterator first, iterator last );
现在我们只关注函数执行后的副作用和返回值。函数调用后使指向position和first之后的所有迭代器失效。返回值则是一个指向删除的最后一个元素后面的元素的迭代器。所以上面代码中的iter在调用erase后就无效了,我在VS2005中测试了,确实崩溃在++的操作上。
要解决这个问题,我们只需弃用原来的迭代器,使用返回值即可,代码如下:
//iter++;放在for循环外面
for(iter = member.begin(); iter != member.end();)
{
}