警告:没有经验的人提出的问题:)
嗨,
我正在为太空作业制作一个模拟太空入侵者的模型,并且正在研究船和外星人会发射/落下的子弹。我有一个抽象的基类来处理所有子弹,有两个派生类-导弹和炸弹。
我最初使用向量,但是我读到某个地方,列表会变得更加高效,因为它们可以如此快地添加和删除(?)。 但是,我是列表的新手,因此遇到了一些麻烦。老实说,我不完全确定如何或是否可以将列表与抽象类一起使用。
我还没有实施炸弹课程,因为我想先让导弹课程开始工作。
以下是基类(射击)+导弹的标题:
enum attackType { BOMB, MISSILE };
class shot
{
private:
float xPos,
yPos;
attackType bombOrMissile;
public:
shot(Vector2f pos, attackType b_OR_m); // passed ship pos + who fired shot
virtual void draw(RenderWindow & win) = 0; // draws bullet on screen
virtual Sprite & getSprite() = 0; // gives sprite information
};
class missile : public shot
{
private:
Sprite missileSprite;
public:
missile(Vector2f pos, Texture & t);
void draw(RenderWindow & win);
Sprite & getSprite();
};
我有一个“射击管理器”类,用于控制项目符号列表。它增加/减少列表并更改精灵位置。
标题:
class shotMgr
{
private:
list<shot*> shotsFired;
Texture missileTexture;
public:
shotMgr(); // loads texture
void shoot(attackType b_OR_m, Vector2f pos);
void disappear();
void move();
void draw(RenderWindow& win);
int getAmountFilled() { return shotsFired.size(); }
};
我的主要问题是:我该如何处理语法?我正在努力解决ptrs问题。在这种情况下,向量最终将是更好的选择,还是我做错了什么?
这是我的shotMgr函数之一,用于演示我当前正在做的事情(它没有编译);其他功能在语法上相似:
void shotMgr::disappear()
{
list<shot>::iterator iter;
for (iter = shotsFired.begin(); iter != shotsFired.end();)
{
if (iter->getSprite().getPosition().y < 0)
{
iter = shotsFired.erase(iter);
}
else
iter++;
}
}
任何建议将不胜感激。谢谢!
答案 0 :(得分:1)
std::vector
效率最高。当代码从向量的任何其他位置插入或删除时,所有索引大于要访问的元素的元素都将发生“移动”。也就是说,当您插入时,数组中该元素右侧的所有内容都需要“移动一个”。同样,在删除时,要删除的元素右侧的所有内容都需要向左滑动。与使用普通数组作为集合没有什么不同。
std::list
更类似于链接列表。每个元素可能使用更多的内存,但是绝对适合随机插入和删除。但是list
与vector
的使用并不是问题的根源。
关于您的编译错误。可能是由于以下原因:
list<shot>::iterator iter;
您要声明list<shot>::iterator
的迭代器,但是您的集合的类型为list<shot*>
。因此,您可能需要list<shot*>::iterator
。让我们修正您的功能。 auto
进行救援,因此您不必太费力地考虑这些东西。
void shotMgr::disappear()
{
for (auto iter = shotsFired.begin(); iter != shotsFired.end();)
{
shot* ptrShot = *iter;
if (ptrShot->getSprite().getPosition().y < 0)
{
iter = shotsFired.erase(iter);
}
else
{
iter++;
}
}
}