清单VS矢量抽象类(List vs Vector with Abstract Classes)

2019-10-29 14:51发布

警告:从别人经验的问题:)

嗨,

我正在太空侵略者的一个家庭作业实物模型和我工作的船舶和外国人将火/下降的子弹。 我有一个抽象基类来处理所有的子弹,有两个派生类 - 导弹和炸弹。

我原来使用的载体,但我读的地方,列表会更有效,因为它们将增加,因此迅速取出(?)。 不过,我是新来的名单,我有一点与它的麻烦。 说实话,我不是很确定我如何或是否可以在所有使用列表与抽象类。

因为我想获得导弹第一级工作我还没有实现,炸弹类呢。

这里的基类(喷丸)+导弹作为例子的头:

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(); }
};

我的主要问题是:我怎么能去这里的语法? 我发现了自己扭起来试图解决的师生比。 是一个向量,最终要在这种情况下,更好的选择,或者是有只是我做错了吗?

下面是我的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++;
    }
}

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

Answer 1:

std::vector当你加入,并在集合的末尾删除是最有效的。 当代码插入或从其他地方在载体中除去,全部用比被访问会招致“移动”的元件更大的索引的元素。 也就是说,当你插入,一切的数组中的元素的右边需要“由一个动过”。 同样,当你删除,一切元素的右侧被删除需要滑动到左边。 不超过如果你使用一个普通的数组作为一个集合不同。

std::list是更类似于一个链表。 可以使用每个元素稍微更多的内存,但对于随机插入和移除肯定更好。 但是,使用list VS 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++;
        }
    }
}


文章来源: List vs Vector with Abstract Classes