Использовать объект в векторе в цикле

0

В настоящее время у меня есть цикл, повторяющийся через вектор, и я пытаюсь найти индекс объекта, в то время как я в цикле, чтобы удалить его. Как я могу это сделать?

Вот мой код:

for (Object &a : objectDict)
    {
        a.setTime(theTime);

        double tempMoveX = 0, tempMoveZ = 0, tempUX = 0,tempUZ = 0;

        for (Object &b : objectDict)
        {
            if (a != b)
            {
                ...
                    debug << fixed << setprecision(20) <<  "Collision" << endl;
                    a.appendMass(b.getMass());

                    objectDict.erase(find(objectDict.begin(), objectDict.end(), b));
                ...

Это важная часть. Как я могу удалить объект b из вектора?

Теги:
loops
vector
stdvector

2 ответа

0
Лучший ответ

Ну, если вам нужен индекс при повторении векторных элементов, а не:

for (Object &a : objectDict) { ...

сделать традиционным:

for (size_t i = 0; i < objectDict.size(); ++i) { ...

и внутри тела цикла: вместо использования ссылки a вы будете использовать objectDict[i], а затем, когда вам нужно будет удалить элемент, вы можете сделать:

objectDict.erase(vec.begin() + i);
i--;

i-- используется для перемещения индекса назад на 1 так что, когда следующая итерация снова увеличивает его, элемент, следующий за стилем, не пропускается.

  • 0
    Это сработало, но раньше этого не произошло, поэтому я использовал непонятный метод. Может быть, я написал что-то не так ...
1

Один простой способ - просто создать отдельный вектор, содержащий индексы элементов для стирания позже. Как только вы закончите проходить через обычный вектор, выполните цикл в обратном порядке через вектор "быть удаленным" (в обратном порядке, потому что вы не хотите отменять индексы по мере продвижения) и стираете их.

В качестве альтернативы, когда вы перебираете исходный вектор, выберите элементы, которые хотите сохранить, и скопируйте их в другой вектор. В самом конце, замените два вектора (что дешево). Это будет работать лучше, если у вас будет относительно много элементов для удаления в среднем.

  • 0
    Не могли бы вы показать мне, как это сделать?
  • 1
    Вы попросили меня написать код для вас в течение двух минут после публикации схемы решения. Это означает, что вы не пытались написать код самостоятельно. Пытаться.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню