C++中将一些代码从我的游戏引擎从Mac移植到Windows,我收到此运行时错误:"矢量擦除超出范围"。它适用于 Mac!
void Entity::runDeferreds() {
for (auto it = deferreds.begin(); it != deferreds.end(); /* nothing */ ) {
if (it->Condition()) {
it->Execution();
it = deferreds.erase(it);
} else {
++it;
}
}
}
这将遍历"延迟"任务列表,这些任务存储在名为 deferreds
的std::vector<DeferredCall>
中。如果满足DeferredCall
的Condition()
,则运行其Execution()
,并且应将其从vector
中删除。但是,相反,我得到了上述错误!
延迟呼叫看起来像这样,并不是说它太重要:
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());
此外,std::vector::erase 保证返回完全有效的迭代器。不过可能vector::end()
。
for_each, 标准::矢量::擦除