从矢量C++中删除时,矢量迭代器不可取消引用

vector iterator not dereferencable when removing from vector C++

本文关键字:迭代器 不可取 引用 可取消 删除 C++      更新时间:2023-10-16

我有一个向量,其中包含大量连续创建和删除的元素。
我想将必须删除的元素与最后一个元素交换,然后使用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();
}

find返回一个迭代器,该迭代器指向找到的元素,该元素(在您的情况下(是要删除的元素。 当你计算pos时,你会得到元素的索引,紧跟在找到的元素之后。 如果找到的元素是向量中的最后一个元素,这将引用一个过去结束的元素。 然后,当您为此计算迭代器时,您将获得无法取消引用的end迭代器。

您无需计算指数。 只需致电

std::swap(*it, m_Entities.back());

然后立即在if体内调用mEneities.pop_back(),而不是之后。 在if外部进行pop_back调用时,如果未找到您要查找的元素,您将删除向量的最后一个元素。

这部分:

int pos = it - mEntities.begin() + 1;

不需要。您需要做的就是:

if (it != mEntities.end())
std::iter_swap(it, mEntities.end() - 1);