std::vector::erase удаляя последний элемент вместо первого
Я довольно новичок в C++, но у меня был вопрос о векторах. Моя цель состоит в том, чтобы удалить элемент из вектора, используя стирание, как только я выйду из своего состояния вне границ. Кажется, все это работает нормально, за исключением того, что когда я вызываю erase, он будет указывать на первый элемент, но удаляет последний. По сути, цикл будет продолжать повторять и удалять каждый элемент из моего вектора. Я использую 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 = определяется как:
void operator=(const Laser& L){};
в моем классе лазера. Я думаю, что моя проблема может быть с этим.
Большое вам спасибо за помощь!
1 ответ
Какие vector::erase
do перемещает все элементы после стертого элемента вперед с помощью присваивания, а затем уничтожает последний элемент. Это нужно сделать, чтобы сохранить инвариант, что элементы в векторе хранятся непрерывно.
Например, дать вектор v
размером 4, стирание v[1]
по существу делает v[1] = v[2]; v[2] = v[3]; v.pop_back();
(Это на самом деле перемещения заданий; std::move
опущено для ясности.)
Если ваше назначение не разрешено (что не разрешено erase
между прочим), тогда это просто уничтожит последний элемент.