Портирование некоторого кода из моего игрового движка с 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());
Однако в этом случае я получаю «несовместимые векторные итераторы».
Хотя он не отвечает, откуда возникла ваша ошибка, вы можете попробовать переделать код следующим образом:
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, станд :: вектор :: Стирание