从矢量C++中删除时,矢量迭代器不可取消引用
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();
}
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);
相关文章:
- 为什么范围算法与 std 的迭代器不兼容?
- 矢量迭代器不能与 std::shared_ptr<> 取消引用
- forward_list迭代器不兼容
- 向量迭代器不兼容的错误,用于保存另一个向量的迭代器的向量
- C++,弹出调试断言失败窗口,我得到矢量迭代器不兼容的错误运行时
- f.getline() 迭代器不增加
- 当我发生碰撞检测时,矢量迭代器不兼容
- 为什么C++字符串迭代器不检查错误?
- debug断言矢量迭代器不可用find_if删除
- 为什么标准容器迭代器不会重载"->*"?
- 为什么反向迭代器不是 C++17 标准下的正式迭代器类别?
- C XTREE崩溃在出口上,映射/设置迭代器不可用
- C++:为什么输出迭代器不支持比较操作?
- 迭代器不兼容错误
- C++向量迭代器不是增量的
- 为什么更多的迭代器不是随机访问?
- 为什么迭代器不返回集合的开头
- 字符串迭代器不兼容错误,当我将字符串转换为矢量<byte>时
- 迭代器不能被另一个相同大小的向量重用吗?
- 字符串迭代器不可用C 问题