@toc
1.问题描述
有一指针vector<B*>
名为vector_b
,其有属性A
,现要找出所有属性A
的值为a1
的项并删除,如下代码有何问题:
iter = vector_b.begin();
while(iter != vector_b.end()){
if((*iter)->A == a1) {
deleteB((*iter));
vector_b.erase(iter);
}
++iter;
}
其中函数deleteB
的定义为:
void deleteB(B*& a){
delete a;
a = NULL;
}
2.正解应为
erase
和insert
后列表的迭代器会发生改变。
erase
调用会返回迭代器返回到列表中的下一个项目(可能是end())
insert
在迭代器之前指向的项目前面插入值。 返回指向插入项的迭代器。 注意,调用后传递给该函数的迭代器将无效。 应该使用返回的迭代器代替。
按照这个返回值,可以将原代码修正为:
iter = vector_b.begin();
while(iter != vector_b.end()){
if((*iter)->A == a1) {
deleteB((*iter));
iter = vector_b.erase(iter);
}
else{
++iter;
}
}
原解决方案
iter = vector_b.begin();
while(iter != vector_b.end()){
if((*iter)->A == a1) {
deleteB((*iter));
vector_b.erase(iter);
}
else{
++iter;
}
}
分析:
使用erase
方法删除一个项后,该项元素的后方的元素就会向前一个位置,如果再进行++iter
可能就跳过了对紧接着被删除元素的比较。