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

Can I use std::vector.size() to control a loop that's removing elements?

我正在研究的对象检测器让我很头疼。
我已经创建了关于可能是问题的其他部分的线程: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--;
    }

?

你的循环没问题(当然,假设 iNeedToRemoveThisElement 没有做任何坏事)。每次都执行循环条件,所以你总是与当前vector.size()比较反映最新更新。

此外,仔细检查循环还会发现您没有陷入比较的另一个潜在陷阱:如果 i 为负,则比较会给出 false 因为 vector.size() 未签名。然而事实证明,在比较时,i 永远不会是负数。

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

无论如何,您应该从 C++ 标准库中查找算法 std::removestd::remove_if。它们可以让你完全摆脱循环,如果你可以使用C++11的lambda函数,它也比循环更简单。