[英]vector iterator not dereferencable when removing from vector C++
我有一个包含大量元素的向量,这些元素会不断创建和删除。
我想将必须删除的元素与最后一个元素交换,然后使用pop_back()
避免在向量中间删除,但我始终认为我的迭代器不可取消引用,我不太明白为什么这样做一个问题。
有人可以解释到底发生了什么吗?
void EntityManager::RemoveEntity(Entity* entity)
{
std::vector<Entity*>::iterator it = std::find(mEntities.begin(), mEntities.end(), entity);
if (it != mEntities.end())
{
int pos = it - mEntities.begin() + 1;
std::iter_swap(mEntities.begin() + pos, mEntities.end()-1);
}
mEntities.pop_back();
}
这部分:
int pos = it - mEntities.begin() + 1;
不需要。 您需要做的就是:
if (it != mEntities.end())
std::iter_swap(it, mEntities.end() - 1);
find
返回一个迭代器,该迭代器指向找到的元素(在您的情况下)是要删除的元素。 计算pos
,将在找到元素后立即获得该元素的索引。 如果找到的元素是向量中的最后一个元素,则将引用“一过去一”元素。 然后,为此计算迭代器时,您将获得无法取消引用的end
迭代器。
您不需要计算索引。 刚打电话
std::swap(*it, m_Entities.back());
然后立即在if
的正文中调用mEneities.pop_back()
,而不是在之后。 在pop_back
之外使用pop_back
调用, if
找不到要查找的元素,则将移除向量的最后一个元素。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.