我的游戏的主循环如下所示:
std::vector<std::unique_ptr<State>> states;
for(size_t i = 0; i < states.size(); i++)
{
states[i]->Update();
states[i]->Draw();
}
不过,他们是一个缺陷。我无法在迭代期间修改向量(删除状态),因为如果我删除了迭代正在进行的当前状态,那么它显然会中断,因为没有状态可以调用更新和绘制。所以我认为制作一个应该添加到states
向量中的状态向量并制作一个应该删除到向量中的状态向量是一个好主意states
。然后在循环结束后修改states
向量并且在迭代中不会出现问题。
std::vector<std::unique_ptr<State>> states;
std::vector<std::unique_ptr<State>> statesToBeAdded;
std::vector<std::unique_ptr<State>> statesToBeRemoved;
for(size_t i = 0; i < states.size(); i++)
{
states[i]->Update();
states[i]->Draw();
}
for(size_t i = 0; i < statesToBeAdded.size(); i++)
{
states.push_back(std::move(statesToBeAdded[i]));
}
statesToBeAdded.clear();
for(size_t i = 0; i < statesToBeRemoved.size(); i++)
{
states.erase(std::remove(states.begin(), states.end(), statesToBeRemoved[i]), states.end());
}
statesToBeRemoved.clear(); //error is thrown here
虽然我不能从states
向量中删除状态,但在线上会抛出一个错误statesToBeRemoved.clear()
,我认为这是因为当我调用该states.erase(...)
行时,它会从向量中删除元素,states
从而使向量中的相同元素无效,statesToBeRemoved
因为该元素指向不再存在的对象。
您不能只删除 std::unique_ptr 而不破坏指针指向的内容,因此我认为没有办法从states
向量中删除元素而不使向量中的元素无效statesToBeRemoved
。那么如何解决这个问题呢?
谢谢。