Я пробовал много других подобных вопросов, но ни один из них не помог мне. Моя проблема следующая: У меня есть 3 вектора указателей на мою структуру: vector<state*>
где state
- это мой тип структуры. Я пытаюсь удалить состояния из vectorCheck
, если они находятся в vectorOpen
или vectorClosed
. Дело в том, что иногда это работает нормально, а иногда и нет. Согласно CodeBlocks это кажется проблемой, но я понятия не имею, чтобы это преодолеть. Я отлаживал свою программу шаг за шагом, и в какой-то момент состояние от vectorCheck
не удаляется, несмотря на то, что оно находится в vectorClosed
.Стирание указателей от вектора при повторении другого вектора
Итерация проводится 2 для петель:
vector<state*> vectorOpen;
vector<state*>::iterator itOpen;
vector<state*> vectorClosed;
vector<state*>::iterator itClosed;
vector<state*> vectorCheck;
vector<state*>::iterator itCheck;
for(itCheck = vectorCheck.begin(); itCheck != vectorCheck.end(); itCheck++) {
for(itOpen = vectorOpen.begin(); itOpen != vectorOpen.end(); itOpen++) {
if ((*itCheck)->player->x == (*itOpen)->player->x &&
(*itCheck)->player->y == (*itOpen)->player->y &&
(*itCheck)->box[0].x == (*itOpen)->box[0].x &&
(*itCheck)->box[0].y == (*itOpen)->box[0].y) {
cout << "erasing as in open " << (*itCheck)->player->x << " " << (*itCheck)->player->y << " " << (*itCheck)->box[0].x << " " << (*itCheck)->box[0].y << endl;
vectorCheck.erase(itCheck);
}
}
}
for(itCheck = vectorCheck.begin(); itCheck != vectorCheck.end(); itCheck++) {
for(itClosed = vectorClosed.begin(); itClosed != vectorClosed.end(); itClosed++) {
if((*itCheck)->player->x == (*itClosed)->player->x &&
(*itCheck)->player->y == (*itClosed)->player->y &&
(*itCheck)->box[0].x == (*itClosed)->box[0].x &&
(*itCheck)->box[0].y == (*itClosed)->box[0].y) {
cout << "erasing as in closed " << (*itCheck)->player->x << " " << (*itCheck)->player->y << " " << (*itCheck)->box[0].x << " " << (*itCheck)->box[0].y << endl;
vectorCheck.erase(itCheck);
}
}
}
Где vectorCheck
это максимальный размер 3. Для того, чтобы объяснить, что я имею в виду вот picture Где я говорю здесь о состояниях в зеленых прямоугольниками (3 1 2 4). Почему он не удаляется, как состояние в синем прямоугольнике (2 2 2 4)? Он должен быть удален, поскольку это состояние появилось уже в vectorClosed
(код выше).
Что я делаю неправильно? Это не первая итерация программы, она происходит в виде 6-го или 7-го цикла.
Кроме того, это, вероятно, приводит к сбою моей программы позже.
'vectorCheck.erase (itCheck)' - Это аннулирует 'itCheck'. 'itCheck ++' и все последующее использование 'itCheck' (кроме присвоения ему нового значения) вызывает неопределенное поведение. (Обратите внимание, что 'erase()' возвращает действительный вектор для элемента, следующего за удаленным элементом.) – cdhowie
Как еще можно удалить его, не проверив его? – Lisek
'itCheck = vectorCheck.erase (itCheck) ', но тогда вам нужно подавить' itCheck ++' на следующей итерации или вы перепрыгнете через элемент. Обычно вы видите, что эти циклы идут 'for (i = c.begin(); i! = C.end();/* nothing * /) {if (should_remove_i) {i = c.remove (i); } else {++ i; }} '. Если у вас есть доступ к C++ 11, вы можете использовать lambdas вместе с 'std :: remove_if', чтобы сделать эту задачу намного проще. – cdhowie