今天写了这样的一段代码:
for (auto it = m_vecBall.begin(); it != m_vecBall.end();)
{
auto x = (*it)->m_ball->getPositionX();
if (x > VISIBLESIZE.width || x < 0)
{
m_vecBall.erase(it);
}
然后一直报错iterator not incrementable。
无奈之下百度了下,原来是因为再适合用迭代器遍历vec的时候使用erase()之后会使迭代器失效,至于为什么会失效,那要看STL这个函数具体的实现了,大家也可以搜索迭代器模式来摸索摸索其中的原理。那么在迭代器失效的同时这个erase函数会返回一个指向下一个对象的迭代器,所以我们可以利用这个返回值来修补这段函数:
for (auto it = m_vecBall.begin(); it != m_vecBall.end();)
{
auto x = (*it)->m_ball->getPositionX();
if (x > VISIBLESIZE.width || x < 0)
{
it=m_vecBall.erase(it);
}
else{
it++;
}
}
这样就没有问题了。