我可以使用std :: vector.size()来控制一个删除元素的循环吗?

时间:2015-03-15 22:29:32

标签: c++ vector

在我正在研究的物体探测器中,我非常头疼 我已经创建了关于可能是问题的其他部分的这个帖子: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--;
    }

1 个答案:

答案 0 :(得分:1)

你的循环没问题(假设iNeedToRemoveThisElement当然没有做任何坏事)。每次都会执行循环条件,因此您始终会与反映最新更新的当前vector.size()进行比较。

此外,仔细检查循环还会发现您不会陷入比较的另一个潜在缺陷:如果i为负数,则比较会给false因为{{1}是无符号的。然而事实证明,在比较时,vector.size()永远不会消极。

有一点需要注意,我不完全确定:如果i引用最后一个元素,则将该元素与自身交换;我不确定这是否是定义的行为(使用C ++ 98 / C ++ 03复制,当然没有问题,但我不确定C ++ 11移动实现是否也支持它)。因此,特殊情况下需要可能更新:正如dyp在评论中解释的那样,允许自我交换,因此不需要特殊情况。

在任何情况下,您都应该从C ++标准库中查找算法istd::remove。它们允许你完全摆脱循环,如果你可以使用C ++ 11的lambda函数,它也比循环更简单。