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между прочим), тогда это просто уничтожит последний элемент.

Другие вопросы по тегам