C++特定索引处的矢量擦除无法使其正常工作

C++ vector erase at specific index doesn't get it to work

本文关键字:常工作 工作 索引 擦除 C++      更新时间:2023-10-16

我的问题是,当我试图擦除向量中的secefic对象时,它会删除该对象之前的所有对象。

我在子弹课上做过这件事,这和它有关系吗?:

Bullet operator=(Bullet);
Bullet Bullet::operator=(Bullet b) {
    Bullet newBullet(NULL, NULL);
    return(newBullet);
}

如果我没有这个,我会得到

错误C2582:"operator="功能在"Bullet"中不可用

这就是我定义项目符号向量的每个元素的地方:

if (p_shoot) {
    bullets.insert(bullets.begin(), Bullet(p_getHitboxX(), p_getHitboxY() + (p_getHitboxH() / 2)));
    p_shoot = false;
}

这是发生这种情况的代码:

if (!bullets.empty()) {
    for (unsigned int i = 0;i < bullets.size();) {
        if (bullets.at(i).bullet_collisionCheck(rect)) {
            bullets.erase(bullets.begin() + i);
        }
        else i++;
    }
}

我不明白为什么它会删除索引中要删除的特定Bullet对象之前的所有Bullet对象。这就像它删除了项目符号.begin()和i.之间的所有对象

假设子弹包含3个子弹对象,第一个子弹碰撞使Bullet_collisionCheck返回true,这意味着索引为0,但它会先擦除子弹[2],然后擦除子弹[1],最后擦除我想先擦除的子弹[0]。

我一直在做一些实验,看看发生了什么,所以我写了这个代码来看看到底发生了什么:

bullets.push_back(Bullet(100, 100));
bullets.push_back(Bullet(200, 200));
bullets.push_back(Bullet(300, 300));
bullets.push_back(Bullet(400, 400));
bullets.push_back(Bullet(500, 500));
bullets.erase(bullets.begin() + 3);

当这个代码运行时,它应该删除Bullet(400400),但它删除了最后一个Bullet(500500)。我将值更改为1,这意味着它应该删除Bullet(200200),但它仍然删除了最后一个Bullet(500500)。发生了什么事?

请帮忙。

我找到了问题的解决方案,感谢大家的帮助。

问题是:

Bullet operator=(Bullet);
Bullet Bullet::operator=(Bullet b) {
    Bullet newBullet(NULL, NULL);
    return(newBullet);
}

我只需要把它改成:

void operator=(const Bullet &b);
void Bullet::operator=(const Bullet &b) {
    bullet_hitbox.x = b.bullet_hitbox.x;
    bullet_hitbox.y = b.bullet_hitbox.y;
}

尝试一下:只是使用基于迭代器的迭代,而不是基于索引。

if(!bullets.empty()) 
    {
        for ( auto it = bullets.begin(); it != bullets.end(); ++it ) 
        {
            if ( it->bullet_collisionCheck(rect) ) 
            {
                it = bullets.erase( it );
                --it;
            }
        }
    }

使用"子弹插入(子弹.begin(),…"添加新对象就是将新对象添加到开头,所以第一个创建的使bullet_collisionCheck返回true的子弹将是最后一个(子弹[2])。我认为条件if (bullets.at(i).bullet_collisionCheck(rect))会导致问题,因为bullets.erase(bullets.begin() + i);应该可以正常工作。