相关疑难解决方法(0)

矢量擦除迭代器外范围

使用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;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

这将通过"延迟"任务列表进行迭代,这些任务存储在std::vector<DeferredCall>被调用的任务中deferreds.如果DeferredCall's' Condition()已经完成,那么它Execution()就会被运行,它应该被删除vector.但是,相反,我得到上述错误!

DeferredCall看起来像这样,而不是它太重要了:

struct DeferredCall {
    std::function<bool()> Condition;
    std::function<void()> Execution;
};
Run Code Online (Sandbox Code Playgroud)

救命?!

编辑: - 替代方法

我也试过这个,再次在Mac上工作:

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

            return false;
        }
    ), deferreds.end());
Run Code Online (Sandbox Code Playgroud)

但是,在这种情况下,我得到"矢量迭代器不兼容".

c++ vector msvc12

0
推荐指数
1
解决办法
1691
查看次数

标签 统计

c++ ×1

msvc12 ×1

vector ×1