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

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

本文关键字:元素 删除 控制 循环 可以使 std vector size 我可以      更新时间:2023-10-16

我正在研究的对象检测器非常头疼。
我已经创建了这个关于可能是问题的其他部分的线程:堆损坏试图将元素添加到现有的 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 函数,它也比循环更简单。