所以我有一个列表类AnimalCollection
,它继承自list<Animal>
。
现在我正在实现一个名为removeById(int id)
的方法,它删除集合中与参数中指定的id
匹配的特定项目。
我目前的实施情况如下:
void AnimalCollection::removeById(int id)
{
for (auto it = this->begin(); it != this->end(); it++)
{
if (it->id == id)
this->remove((Animal)it);
}
}
现在,在我的代码的第6行,很明显将迭代器转换为当前正在迭代的类型是不明智的。
关键是,我想让迭代器it
迭代当前项。
任何有想法如何做的人?
答案 0 :(得分:4)
std::list#begin()
返回的迭代器是bidirectional iterator。因此,它也是input iterator并支持解除引用运算符(*it
)来访问正在迭代的底层对象:
this->remove(*it);
但请注意,对remove
的调用将再次在列表上进行迭代,以查找并删除所有等于*it
的元素。
或者,您可以使用std::list#erase()
直接从列表中删除迭代器(以及仅引用它的元素),并避免可能无用的迭代:
for (auto it = this->begin(); it != this->end(); ) {
if (it->id == id) {
it = this->erase(it);
} else {
++it;
}
}
请注意,如果调用erase(it)
,则迭代器it
将失效,因此为了继续迭代列表,我们使用erase
返回的迭代器指向最后一个删除元素后面的元素,可能是end()
答案 1 :(得分:2)
如果您只需删除it
引用的元素,那么erase(it)
就是您所需要的。