从对象矢量中删除对象

时间:2015-08-28 19:01:29

标签: c++ visual-c++

我有一个物体矢量..怪物。我有一个功能"拍摄"。我希望当我杀死其中一个怪物时要删除的对象。我试过各种方法,但没有成功。 以下是我创建对象的方法:

rownames(df1)[df1$ColumnA >=2.5]

这是我在英雄"前面找到怪物的功能。我杀了它......或者不......我不知道如何删除它:D 我认为我宣布" trage"功能,但我无法弄清楚。

void AdaugareMonstru(vector<monstru>& Nmonstru){
    int i = 0;
        srand(time(0));
        int a, b;
        for (i; i < 4; i++){
            a = (rand() % 5)+1;
            b = (rand() % 8)+1;

            while (a == 1 && b == 1){
                a = (rand() % 5)+1;
                b = (rand() % 8)+1;
            }
            monstru newMonstru(a,b);
            Nmonstru.push_back(newMonstru);
        }
    }

3 个答案:

答案 0 :(得分:2)

erase从向量中移除一个对象并将其销毁。如果您仍然需要该对象,请先获取它的副本。如果您有指针,请将它们视为有毒废物。请勿触摸它们并尽快摆脱它们。想一想,首先不要指向矢量元素。任何插入或擦除操作都会使它们指向错误的元素或完全无效。如果你有向量的优秀迭代器,则认为它们无效。

在OP的代码中,monstru.erase(monstru.begin() + i);将杀死怪物。

但是有更好的方法可以找到要杀死的怪物。 Malte Schmitz展示了蛮力方法。以下是一点点野蛮。

首先向class monstru

添加便利功能
bool isAt(int x, int y) const
{
    return (mX == x && mY == y);
}

mXmY是monstru的位置。我不知道他们的内部名称,所以我使用mX和mY作为占位符。

然后快速更改功能trage的原型部分用于美学,部分用于消除命名冲突。对多个事物使用相同的名称使得很难找到东西。

在多个功能中使用x很酷。在同一个函数中使用两个名为x的东西是非常危险的,即使它的范围不同,所以它们不会发生冲突。使用类型为x x;的{​​{1}}变量x非常麻烦,因此应该清除x以防止混淆和搞砸。

vector<monstru> monstru

lambda expression是一种嵌入式匿名函数。但只是一点点。没有必要重新解释它,所以请阅读:What is a lambda expression in C++11?

void trage(vector<monstru>& monstruList, vector<vector<char> > &map, int x, int y, int face) { if (face == 1) // not sure what this does, but I'm keeping it. { auto it = std::find_if(monstruList.begin(), monstruList.end(), [x,y](const monstru & monst) // lambda expression { return monst.isAt(x,y); }); if (it != monstruList.end()) { monstruList.erase(it); } } } 表示局部x和y变量被“捕获”并且在lambda表达式的主体内可用。

[x,y]是参数列表,特别是通过引用我们称之为monst的常量monstru来调用lambda。

简单的身体很简单,它只返回我在上面添加的(const monstru & monst)方法的结果,该方法使用从周围函数捕获的x和y来调用。

OP还应该研究存储怪物位置的其他方法,例如稀疏矩阵或std :: map。

答案 1 :(得分:1)

delete关键字实际上与std::vector无关 它用于删除使用new语句分配的内存 这显然不是你在这里做的。

要从矢量中移除元素,您应该使用monstru.erase(monstru.begin() + n);从矢量中删除第n个元素。

我认为您打算从vector删除与您的if语句匹配的怪物。但是,您必须注意不要直接访问monstru[3],例如,因为它不清楚它是否存在。因此,您应该使用for循环来概括您的代码,这样可以使其更易于阅读,并且更小,因为这是一个很好的副作用):

void trage(vector<monstru>& monstru, vector< vector<char> > map,int x,int y,int face){
    if (face == 1)
    {
        for (int i = y; i < 10; i++){
            for (int m = 0; m < monstru.size(); m++){
                //use index 'm' here:
                if (monstru[m].GetX() == x && monstru[0].GetY() == i){
                    monstru.erase(monstru.begin() + m);
                    cout << "Ai ucis un monstru" << endl;
                }
            }
        }
    }
}

答案 2 :(得分:0)

正如您所看到的here,monstru.erase()需要一个迭代器。 你需要做一些像

这样的事情
monstru.erase(monstru.begin() + index)

index 你想要杀死的怪物的位置&#34;杀死&#34;在向量中

另外,在你的第一个片段中,一个do..while可能会更好

相关问题