使用find从矢量中清除所有偶数

这个问题在这里已经有了答案:

  • 迭代器失效规则4个答案

  • 使用erase(it); 函数迭代器发生了变化,所以您需要将迭代器再次设置为由擦除函数返回的新迭代器。

    在你的代码中, if(q == myVec.end())检查结束,然后使用擦除将会抛出一个错误,因为end()不指向数据,并且能够从迭代器需要有效的向量。 因此,通过将if(q == myVec.end())更改为if(q == (myVec.end()-1)) ,它将允许您删除最后一个元素,以防成对出现。


    std::vector::erase使所有迭代器在删除点之后失效。 你不能继续使用该迭代器,不能增加它,使用它来访问矢量,或者甚至将它与end()进行比较。

    使用正确的算法是std:remove_if 。 与名称不同,它只会将矢量的所有偶数项“移到后面”,而不会使任何迭代器失效。 它会将一个迭代器返回到这个子范围的开始处,然后您可以将其馈送到适当的erase重载(接受一对迭代器的那个)。

    这在代码中已被广泛使用,甚至被命名为“擦除删除语言”。

    链接地址: http://www.djcxy.com/p/73343.html

    上一篇: Erase all even numbers from vector using find

    下一篇: Can iterators become invalid after operations?