列表与向量与抽象类

List vs Vector with Abstract Classes

本文关键字:抽象类 向量 列表      更新时间:2023-10-16

警告:来自没有经验的人的问题:)

你好

我正在为家庭作业制作太空入侵者的模型,我正在研究飞船和外星人将发射/投掷的子弹。我有一个抽象的基类来处理所有子弹,有两个派生类 - 导弹和炸弹。

我最初使用向量,但我在某处读到列表会更有效,因为它们会很快被添加和删除(? 但是,我是列表的新手,我遇到了一些麻烦。老实说,我不完全确定如何或是否可以使用带有抽象类的列表。

我还没有实施炸弹类,因为我想先让导弹类工作。

以下是基类(射击)+导弹的标题作为示例:

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++;
}
}

任何建议将不胜感激。谢谢!

std::vector

在集合末尾添加和删除时最有效。 当代码从向量中的其他任何位置插入或删除时,索引大于所访问元素的所有元素都将产生"移动"。 也就是说,当您插入时,数组中该元素右侧的所有内容都需要"移动一"。 同样,删除时,要删除的元素右侧的所有内容都需要向左滑动。与使用普通数组作为集合没有什么不同。

std::list更类似于链表。每个元素可能会使用更多的内存,但对于随机插入和删除绝对更好。 但是listvector的使用并不是问题的根源。

至于你的编译错误。 这可能是由于这个:

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++;
}
}
}