Итератор стирания вектора вне диапазона

Портирование некоторого кода из моего игрового движка с Mac на Windows в C ++, и я получаю эту ошибку времени выполнения: «Стирание вектора вне диапазона». Это работает на Mac!

void Entity::runDeferreds() {
for (auto it = deferreds.begin(); it != deferreds.end(); /* nothing */ ) {
if (it->Condition()) {
it->Execution();

it = deferreds.erase(it);
} else {
++it;
}
}
}

Это повторяет список «отложенных» задач, которые хранятся в std::vector<DeferredCall> называется deferreds, Если DeferredCall«s Condition() выполняется, то его Execution() выполняется, и он должен быть удален из vector, Однако вместо этого я получаю вышеупомянутую ошибку!

DeferredCall выглядит так, но не слишком важно:

struct DeferredCall {
std::function<bool()> Condition;
std::function<void()> Execution;
};

Помогите?!

РЕДАКТИРОВАТЬ: — Альтернативный метод

Я также попробовал это, снова работая на Mac:

deferreds.erase(std::remove_if(deferreds.begin(), deferreds.end(),
[](DeferredCall &call) {
if (call.Condition()) {
call.Execution();
return true;
}

return false;
}
), deferreds.end());

Однако в этом случае я получаю «несовместимые векторные итераторы».

1

Решение

Хотя он не отвечает, откуда возникла ваша ошибка, вы можете попробовать переделать код следующим образом:

const auto pred = [](Deferred& d){ return !d.Condition(); };
auto itMatch = std::partition( defs.begin(), defs.end(), pred);

const auto action = [](Deferred& d){ d.Execution(); };
std::for_each(itMatch, defs.end(), action);

defs.erase(itMatch, defs.end());

Также, станд :: вектор :: Стирание гарантированно вернет совершенно корректный итератор. Может быть vector::end() хоть.

Ссылки: станд :: раздел, станд :: for_each, станд :: вектор :: Стирание

5

Другие решения


По вопросам рекламы [email protected]