在vector中的vector之间移动指针会导致vector迭代器不兼容



我有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);
}

最新更新