gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 20:39:12 24 4
gpt4 key购买 nike

我是 C++ 的新手,但对 vector 有疑问。我的目标是一旦我遇到越界条件,就使用 erase 从 vector 中删除一个元素。这一切似乎工作正常,除了当我调用删除时,它将指向第一个元素,但删除最后一个。基本上,循环将继续迭代并从我的 vector 中删除每个元素。我在代码的其他地方使用 push_back 将激光添加到我的 vector 中。

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

}
}

我的 =operator 定义为:

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

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

非常感谢您的帮助!

最佳答案

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

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

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

关于c++ - std::vector::erase 删除最后一个元素而不是第一个,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28599289/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com