当我尝试从向量中删除项目时,如果项目被布尔值设置为不活动,则会出现错误。我试过在网上搜索但是没有找到任何关于它的信息。我试图找到不同的方法来删除矢量中索引x上的元素,并找到函数:vector.erase(vector.begin()+ index)
因此,当我尝试在for循环中使用它时,我的访问冲突读取位置指向擦除功能行。
错误所在的循环代码:
if (!player.getBullets().empty())
{
for (int x = 0; x < player.getBullets().size(); x++)
{
//Check for projectiles whos status is dead.
if (!player.getBullets()[x]->getAlive())
{
//Erase the element at position x.
player.getBullets().erase(player.getBullets().begin() + x);
}
}
}
答案 0 :(得分:2)
#include <algorithm>
player.getBullets().erase(
std::remove_if(player.getBullets().begin(),
player.getBullets().end(),
[](Projectile * p) -> bool { return !p->getAlive(); }),
player.getBullets().end());
(我假设Bullet
与decltype(player.getBullets())::value_type
相同,即项目符号容器的元素类型。调整以适应。)
答案 1 :(得分:0)
如果使用迭代器而不是索引,则更容易擦除。 (几乎)直接转换代码:
vector<Projectile*> bullets = player.getBullets();
for (vector<Projectile*>::iterator x = bullets.begin(); x != bullets.end(); )
{
//Check for projectiles whos status is dead.
if (!(*x)->getAlive())
{
//Erase the element at position x.
x = bullets.erase(x);
}
else
{
++ x;
}
}
请注意,这仅适用于矢量的本地副本。如果要更新播放器类本身中的向量,则需要更改getBullets
以返回引用:
vector<Projectile*> &Sprite::getBullets()
{
return bullets;
}
然后循环:
vector<Projectile*> &bullets = player.getBullets();
答案 2 :(得分:0)
虽然循环无效,因为计数器x增加而向量的大小减小,结果并非遍历所有向量,但我没有看到访问冲突的原因。我认为问题与存储在矢量中的对象有关。