C++ - 矢量迭代器 + 偏移超出范围
C++ - Vector iterator + offset out of range
我已经查看了大约 10 个关于同一消息的答案,但尚未找到我的问题。
在 level.h 中 Level 类中:
std::vector<Bomb> m_bombs;
在级别.cpp:
添加炸弹:
Bomb bomb;
bomb.owner = player;
bomb.power = power;
bomb.x = pos.x;
bomb.y = pos.y;
bomb.timer = 3.0f;
m_bombs.push_back(bomb);
检查炸弹(每帧):
void Level::updateBombs(float dt)
{
for(int i = 0; i < m_bombs.size(); i++)
{
m_bombs[i].timer -= dt;
if(m_bombs[i].timer <= 0)
m_bombs.erase(m_bombs.begin() + i);
}
}
我 100% 确定程序在调用擦除函数的行上崩溃。我能够从向量输出信息,这使得这种方式更加混乱。炸弹正确位于矢量中。如果我m_bombs.remove_last()这样做,它会删除向量中的最后一个元素。似乎只是在擦除和开始()方面存在问题。
您可以使用 erase-remove-idiom 来修复代码。
m_bombs.erase(std::remove_if(m_bombs.begin(), m_bombs.end(),
[](const Bomb& b){ return b.timer < 0.0f;}),
m_bombs.end());
最好updateBombs
函数拆分为两个函数:
updateBombs() does bomb timer update only
removeBombs() removes bombs which expired
也许您可以尝试向后擦除矢量,例如,如果要擦除炸弹索引 3 和 5,则删除索引为 5 然后是 3 的那个,因为如果您从 0
到 N-1
按顺序擦除,当您擦除索引 3 时,索引 5 将成为索引 4,这可能会导致在到达循环的最后一步时超出界限。
试试这个:
int pivot = 0
void Level::updateBombs(float dt)
{
for(int i = 0; i < m_bombs.size(); i++)
{
m_bombs[i].timer -= dt;
if(m_bombs[i].timer <= 0)
{
m_bombs.erase(m_bombs.begin() + i - pivot);
pivot++;
}
}
}
我在清除或创建向量时遇到了类似的问题。出现此问题的原因是在运行时使用了 2 个不同版本的 dll。清除和创建是在调用 Open CV 函数时发生的,这些函数似乎使用与我的视觉工作室不同的运行时库。更改Visual Studio最终解决了这个问题(在更改Visual Studio之前,我尝试了很多旧的OpenCV构建,但无济于事)。VS 2008 和 2013 不起作用,VS2010 起作用了。
我会用你自己的int
变量替换m_bombs.size()
,你在移除炸弹后递减。我个人在.size()
方面遇到了问题.它应该返回向量中的元素数量,但我有一个空向量,.size()
返回大于零的数字。 也许尝试这样做将有助于缩小您的问题范围。
相关文章:
- 转到基于范围的 for 循环中的下一个迭代器
- C++:返回一个基于范围 for 循环迭代器,其中包含继承对象
- 迭代器范围的平衡分区,没有LegacyRandomAccessIterator
- 为什么范围算法与 std 的迭代器不兼容?
- Deque 迭代器超出范围
- unordered_set范围插入与迭代器
- 类型不可知的抽象以使用相同的运行时接口处理正向和反向迭代器和范围?
- 访问基于范围的循环(如for_each)中的std::map迭代器
- 迭代器的范围 TS 和 C++20 概念是否需要能够使用"运算符>"?
- 列出超出范围的擦除迭代器
- 如何使用提升范围将自定义迭代器封装在函数中
- 无法取消引用超出范围的向量迭代器 - 有什么问题?
- 如何在基于范围的 for 循环中更改(向前/向后移动)迭代器?
- 如何修复错误,迭代器未在此范围内声明,并且迭代器未命名类型'
- 将迭代器放置为临时范围时,非销钉 - 操作和错误
- C 迭代器范围使用指针到数组
- 为什么我们要把 :: (范围重新定位运算符)放在迭代器之前
- 将迭代器范围复制到矢量而不重复
- C++:指向错误元素的提升范围迭代器
- re C++范围迭代器:只有一个类不好吗