从向量C ++中删除时,向量迭代器不可解除引用

时间:2018-05-19 17:31:30

标签: c++ vector iterator

我有一个包含大量元素的向量,可以不断创建和删除 我想用最后一个元素交换必须删除的元素,然后使用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();
}

2 个答案:

答案 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调用,如果找不到您要查找的元素,则会删除该向量的最后一个元素。