c++ - 运行时错误 : map/set iterators incompatible

标签 c++ iterator runtime-error

我在第 8 行遇到运行时错误“map/set iterators incompatible”。

void Manager::Simulate(Military* military, Shalishut* shalishut,char* args[]){
    Simulation* simulation = Simulation::GetInstance();
    Time* time = Time::GetInstance();

    multimap<int,Task*>::iterator itTasks;
    itTasks = simulation->GetTasks().begin();
    while(itTasks != simulation->GetTasks().end()){
      while (itTasks->second->GetTimeStamp() == time->GetTime()){ /*line 8 - ERROR*/
            TaskExecute(itTasks->second,military,shalishut,args);
            itTasks++;
        }
        // Unit take car of vehicles
        time->TimeIncrease();
    }

}

Simulation被声明为 multimap<int,Task*> .有什么问题?

最佳答案

我要大胆猜测一下 Simulation::GetTasks()签名看起来像这样:

multimap<int,Task*> GetTasks() const;

这会在您每次调用它时创建一个新的多重映射(一个拷贝)。

比较迭代器时,multimap<int,Task*>迭代器必须来自同一个容器;因为每次调用 GetTasks() 都会得到一份新拷贝,你违反了这个约束,这是你错误的根源。您还有另一个问题 - 临时 multimap 拷贝在创建它们的语句后被销毁,因此您的迭代器立即失效。

你有两个选择;一种是在本地捕获一个拷贝并始终如一地使用该拷贝:

multimap<int,Task*> tasks = simulation->GetTasks();
multimap<int,Task*>::iterator itTasks;
itTasks = tasks.begin();
while(itTasks != tasks.end()){
  while (itTasks->second->GetTimeStamp() == time->GetTime()){
        TaskExecute(itTasks->second,military,shalishut,args);
        itTasks++;
    }
    // Unit take car of vehicles
    time->TimeIncrease();
}

另一个是有GetTasks()返回对持久 multimap 的引用,确保每次都使用相同的 multimap :

multimap<int,Task*> &GetTasks();

或常量引用:

const multimap<int,Task*> &GetTasks() const;

这样做的好处是避免了复制 multimap 的(可能很大的)开销。 .

请注意,使用 const 引用需要使用 const_iterator s 逐步通过 multimap 。我建议同时定义 const 和非 const 访问器(C++ 将根据 Simulation 指针或引用是否为 const 选择正确的访问器),除非您想禁止直接修改底层 multimap完全,在这种情况下,您只能定义 const变体。

关于c++ - 运行时错误 : map/set iterators incompatible,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3772304/

相关文章:

c++ - 访问字符指针

c++ - 指向指针或引用的迭代器 - 错误

vba - 如果我的vba遇到错误,如何进行下一个步骤?

ios - 更新uitableview时断言失败

带有 Clang 的 QtCreator 中的 C++14 支持

c++ - 用一组对作为单元格值实例化二维 vector

c++ - 如何重载逗号运算符以将值分配给数组

c++ - 迭代器要求明显不一致

java - 在Java中的foreach循环中调用remove

java - "ERROR: Unresolved reference: Thread in Eclipse IDE"