我有std::vector
的单元格。每个单元格都有其他的std::vector
来存储指向实体的指针。现在我想移动指针从一个单元格到另一个基于计算新的单元格索引。但我得到了vector iterators incompatible
。我知道这是由push_back
无效的迭代器引起的,但我不知道为什么,因为push_back
不与当前存在的entityIter
操作。我应该如何修改下面的示例使其工作?
for(uint32 cellIndex = 0; cellIndex < m_cells.size(); ++cellIndex)
{
std::vector<entity_type> & entitiesInCurrentCell = m_cells[cellIndex].entities;
std::vector<entity_type>::iterator entityIter = entitiesInCurrentCell.begin();
while(entityIter != entitiesInCurrentCell.end())
{
entity_type entity = *entityIter;
uint32 entityNewIndex = calculateIndex(entity->getPosition());
if(entityNewIndex == cellIndex)
{
++entityIter;
continue;
}
m_cells[entityNewIndex].entities.push_back(entity);
entitiesInCurrentCell.erase(entityIter++);
}
}
entity_type
是指向别处分配的实体的指针类型,我不想删除它,只是在单元格之间移动指针。
(我知道这种方法不是最好的方法-将指针重新定位到高索引单元会导致重新计算它-但这是这个问题的目的)
谢谢
从entitiesInCurrentCell
中删除的行有一个错误。修改为
entityIter = entitiesInCurrentCell.erase(entityIter);
当从容器中删除时,下一个迭代器由erase函数返回,因此不需要对迭代器进行自增操作。
从std::vector中删除将使迭代器失效。参见STL vector::erase因此,调用erase后entityIter无效。唉,检查"while(entityIter != entitiesInCurrentCell.end())"永远不会变为真值。
将代码改为:
if(entityNewIndex == cellIndex)
{
++entityIter;
}
else
{
m_cells[entityNewIndex].entities.push_back(entity);
entityIter = entitiesInCurrentCell.erase(entityIter);
}