从std :: list中随机删除?

时间:2011-12-29 02:54:57

标签: c++ list

我正在将矢量更改为列表,我遇到了一些问题。

此代码现在不正确:

    privateChildren.erase(privateChildren.begin() +
            getPrivateChildIndex(widget));

如何解决这个问题。用户提供他们想要删除的小部件的索引。

由于

getPrivateChildIndex返回私有子项的索引。因此,如果我推送3个孩子,getPrivateChildIndex(thirdElem)将返回2。

3 个答案:

答案 0 :(得分:3)

使用std :: advance作为迭代器。列表迭代器不会像你看到的那样实现+运算符。

请参阅How do you find the iterator in the middle of two iterators?

答案 1 :(得分:1)

首先,如果您必须通过索引访问容器,那么使用std::list可能不是一个好主意。实际上,很少有情况,它是适当的容器选择。

其次,getPrivateChildIndex如何发现索引?如果它遍历列表,那么它可以返回迭代器而不是索引。然后你就可以做到:

privateChildren.erase(getPrivateChild(widget));

最后,如果您确定要使用链接列表并且必须使用索引,那么您需要的是std::advance函数:

#include <iterator>
int index(getPrivateChildIndex(widget));
privateChildren.erase(std::advance(privateChildren.begin(), index));

答案 2 :(得分:0)

理想情况下,对于向量或列表版本,您不会从getPrivateChildIndex(widget)获取索引而是获取迭代器(例如,使用std::find()std::find_if())。如果您绝对需要在索引中返回,则可以使用std::advance()移动到您在getPrivateChildIndex()中找到的位置。