在此代码片段中,Update()返回一个布尔值,如果返回false,我想从向量中删除该元素。
但是,这会产生调试断言失败的运行时错误。表达式是“矢量迭代器不可递增”。
代码:
for(auto iter = someVector.begin(); iter != someVector.end(); ++iter){
if(!iter->get()->Update()) iter = someVector.erase(iter);
}
我也试过从迭代器中减去如下:
for(auto iter = particles.begin(); iter != particles.end(); ++iter){
if(!iter->get()->Update()) iter = --(particles.erase(iter));
}
...但这导致“矢量迭代器不可减少”。
如何让我的代码按预期工作;以便在Update()函数返回false时删除vector元素?
答案 0 :(得分:5)
将循环更改为:
for(auto iter = someVector.begin(); iter != someVector.end();){
if(!iter->get()->Update())
iter = someVector.erase(iter);
else
++it;
}
断言的原因是,在致电erase
后,iter
可能等于end()
。 erase
返回的迭代器已经是“下一个”,你不应该增加它。
答案 1 :(得分:1)
我建议首先使用{strong>不使用erase()
,而是使用类似这样的内容:
someVector.erase(std::remove_if(someVector.begin(), someVector.end(),
[](decltype(*someVector.begin()) element){
return !element.get()->update();
},
someVector.end());
当只需要擦除一个元素时,它与使用erase()
的一个迭代器版本大致相同。当需要擦除多个元素时,它会减少副本/移动。请注意,我使用lambda函数只是因为它更容易表达,但如果lambda函数不可用,则可以使用合适的函数对象完成相同的操作。