C++特定索引处的矢量擦除无法使其正常工作
C++ vector erase at specific index doesn't get it to work
我的问题是,当我试图擦除向量中的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);
应该可以正常工作。
- QSqlquery prepare()和bindvalue()不工作
- 导入库可以跨dll版本工作吗
- 以螺旋方式打印矩阵的程序.(工作不好)
- 对象指针在c++中是如何工作的
- 为什么在Windows上的VS 2019和Clang 9中"size_t"在没有标题的情况下工作
- VSOMEIP-2个设备之间的通信(TCP/UDP)不工作
- 为字符串中每 N 个字符插入空格的函数没有按照我认为的方式工作?
- C++为线程工作动态地分割例程
- 为什么我的 std::ref 无法按预期工作?
- 布尔比较运算符是如何在C++中工作的
- SampleConsensusPrerejective(ext.RANSAC)是如何真正工作的
- 不确定要在我的main中放入什么才能使我的代码正常工作
- 为什么std::condition_variable notify_all的工作速度比notify_one快(对于随机请
- <<操作员在下面的行中工作
- 有人能解释一下为什么下界是这样工作的吗C++的
- ExtractIconEx:可以工作,但偶尔会崩溃
- C++中的memset函数工作不正常
- 当我在第一个循环中使用"auto"时,它工作正常,但是使用"int"它会给出错误,为什么?
- 为什么STD ::计数将常数传递给Lambda,而不是在弦上工作时而不是字符
- C++程序已停止工作-求解常微分方程