在我正在研究的物体探测器中,我非常头疼 我已经创建了关于可能是问题的其他部分的这个帖子:Heap Corruption trying to add elements to existing std::vector
但是,现在,我想,也许我从矢量中删除元素的方式可能是我的问题。所以,简单的问题,我可以做这样的事情......
for (int i=0; i < vector.size(); i++){
if(iNeedToRemoveThisElement){
std::swap(vector[i],vector.back());
vector.pop_back();
i--;
}
答案 0 :(得分:1)
你的循环没问题(假设iNeedToRemoveThisElement
当然没有做任何坏事)。每次都会执行循环条件,因此您始终会与反映最新更新的当前vector.size()
进行比较。
此外,仔细检查循环还会发现您不会陷入比较的另一个潜在缺陷:如果i
为负数,则比较会给false
因为{{1}是无符号的。然而事实证明,在比较时,vector.size()
永远不会消极。
有一点需要注意,我不完全确定:如果i
引用最后一个元素,则将该元素与自身交换;我不确定这是否是定义的行为(使用C ++ 98 / C ++ 03复制,当然没有问题,但我不确定C ++ 11移动实现是否也支持它)。因此,特殊情况下需要可能。 更新:正如dyp在评论中解释的那样,允许自我交换,因此不需要特殊情况。
在任何情况下,您都应该从C ++标准库中查找算法i
和std::remove
。它们允许你完全摆脱循环,如果你可以使用C ++ 11的lambda函数,它也比循环更简单。