В настоящее время у меня есть цикл, повторяющийся через вектор, и я пытаюсь найти индекс объекта, в то время как я в цикле, чтобы удалить его. Как я могу это сделать?
Вот мой код:
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 из вектора?
Ну, если вам нужен индекс при повторении векторных элементов, а не:
for (Object &a : objectDict) { ...
сделать традиционным:
for (size_t i = 0; i < objectDict.size(); ++i) { ...
и внутри тела цикла: вместо использования ссылки a
вы будете использовать objectDict[i]
, а затем, когда вам нужно будет удалить элемент, вы можете сделать:
objectDict.erase(vec.begin() + i);
i--;
i--
используется для перемещения индекса назад на 1
так что, когда следующая итерация снова увеличивает его, элемент, следующий за стилем, не пропускается.
Один простой способ - просто создать отдельный вектор, содержащий индексы элементов для стирания позже. Как только вы закончите проходить через обычный вектор, выполните цикл в обратном порядке через вектор "быть удаленным" (в обратном порядке, потому что вы не хотите отменять индексы по мере продвижения) и стираете их.
В качестве альтернативы, когда вы перебираете исходный вектор, выберите элементы, которые хотите сохранить, и скопируйте их в другой вектор. В самом конце, замените два вектора (что дешево). Это будет работать лучше, если у вас будет относительно много элементов для удаления в среднем.