我正在将矢量更改为列表,我遇到了一些问题。
此代码现在不正确:
privateChildren.erase(privateChildren.begin() +
getPrivateChildIndex(widget));
如何解决这个问题。用户提供他们想要删除的小部件的索引。
由于
getPrivateChildIndex返回私有子项的索引。因此,如果我推送3个孩子,getPrivateChildIndex(thirdElem)将返回2。
答案 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()
中找到的位置。