【问题标题】:std::vector::erase deleting last element instead of firststd::vector::erase 删除最后一个元素而不是第一个元素
【发布时间】:2015-04-20 09:06:22
【问题描述】:

我对 c++ 还很陌生,但对向量有疑问。我的目标是一旦我达到超出范围的条件,就使用擦除从向量中删除一个元素。这一切似乎工作正常,除了当我调用擦除时,它将指向第一个元素,但删除最后一个元素。基本上,循环将继续迭代并删除我的向量中的每个元素。我正在使用 push_back 将激光添加到代码中其他地方的向量中。

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 =operator 定义为:

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

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

非常感谢您的帮助!

【问题讨论】:

    标签: c++ vector erase


    【解决方案1】:

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

    例如,给定一个大小为 4 的向量 v,擦除 v[1] 本质上就是 v[1] = v[2]; v[2] = v[3]; v.pop_back();(这些实际上是移动分配;为清楚起见,省略了 std::move。)

    如果您的分配是空操作(顺便说一句,erase 的要求不允许这样做),那么这最终只会破坏最后一个元素。

    【讨论】:

    • 啊,我明白了。那么我应该将我的作业更改为什么?抱歉,我还是新手。
    • 啊,我找到了解决这个问题的方法。我可以只使用一个指针数组。无论如何,这可能是一种更好的方法。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-31
    • 1970-01-01
    • 1970-01-01
    • 2019-11-17
    相关资源
    最近更新 更多