我有一个包含大量元素的向量,可以不断创建和删除
我想用最后一个元素交换必须删除的元素,然后使用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();
}
答案 0 :(得分:0)
这部分:
int pos = it - mEntities.begin() + 1;
不需要。您需要做的就是:
if (it != mEntities.end())
std::iter_swap(it, mEntities.end() - 1);
答案 1 :(得分:0)
find
返回一个指向找到的元素的迭代器,在你的情况下,它是你要删除的元素。计算pos
时,您会在找到的元素之后获得该元素的索引。如果找到的元素是向量中的最后一个元素,那么这将引用一个过去的结束元素。然后,当你为此计算迭代器时,你将获得end
迭代器,你无法解除引用。
您不需要计算索引。只需致电
std::swap(*it, m_Entities.back());
然后立即在mEneities.pop_back()
的正文中调用if
,而不是之后。通过pop_back
之外的if
调用,如果找不到您要查找的元素,则会删除该向量的最后一个元素。