获取当前对象在列表C ++中迭代

时间:2015-08-03 09:12:24

标签: c++ iterator

所以我有一个列表类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迭代当前项。

任何有想法如何做的人?

2 个答案:

答案 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)就是您所需要的。