std :: vector :: erase删除最后一个元素而不是第一个元素

时间:2015-02-19 05:35:11

标签: c++ vector erase

我对c ++很新,但对矢量有疑问。我的目标是在我超出界限条件时使用擦除从向量中移除元素。这一切似乎工作正常,除了当我调用erase时,它将指向第一个元素,但删除最后一个。基本上,循环将继续迭代并删除向量中的每个元素。我正在使用push_back将Lasers添加到代码中其他位置的向量中。

std::vector<Laser> m_Lasers;

for (int i = 0; i != m_Lasers.size(); i++)
{
    m_Lasers[i].ClearLaser();

    if (m_Lasers[i].GetX() > m_ScreenWidth || m_Lasers[i].GetX() < 0 || m_Lasers[i].GetY() < 0)
    {
        //erase the vector
        m_Lasers.erase(m_Lasers.begin() + i);
        i--;

    }
}

my =运算符定义为:

void operator=(const Laser& L){};

在我的激光课上。我认为我的问题可能与此有关。

非常感谢你的帮助!

1 个答案:

答案 0 :(得分:5)

vector::erase做的是使用赋值移动擦除元素之后的所有元素,然后销毁最后一个元素。它必须这样做才能保持向量中元素连续存储的不变量。

例如,提供大小为4的向量v,删除v[1]基本上执行v[1] = v[2]; v[2] = v[3]; v.pop_back();(这些实际上是移动分配;为清晰起见,省略了std::move。)< / p>

如果您的作业是无操作(顺便说一下erase的要求不允许),那么这最终会破坏最后一个元素。