在这段代码片段中,Update()返回一个布尔值,如果返回false,我想从向量中删除该元素 .
但是,这会导致调试断言的运行时错误失败 . 表达式是“矢量迭代器不可递增” .
The code:
for(auto iter = someVector.begin(); iter != someVector.end(); ++iter){
if(!iter->get()->Update()) iter = someVector.erase(iter);
}
I have tried subtracting from the iterator as follows too:
for(auto iter = particles.begin(); iter != particles.end(); ++iter){
if(!iter->get()->Update()) iter = --(particles.erase(iter));
}
...但这导致“矢量迭代器不可减少” .
How can I make my code works as intended; so that the vector element is deleted when the Update() function returns false?
2 回答
将循环更改为:
断言的原因是,在调用
erase
之后,iter
可能等于end()
.erase
返回的迭代器已经"next",你不应该增加它 .我首先推荐 not 使用
erase()
如上所述,而是使用类似这样的东西:当只需要擦除一个元素时,它与使用
erase()
的一个迭代器版本大致相同 . 当需要擦除多个元素时,它会减少副本/移动 . 请注意,我使用lambda函数只是因为它更容易表达,但如果lambda函数不可用,则可以使用合适的函数对象来完成相同的操作 .