2010-09-22 49 views
6

集迭代我有“图/设定迭代器不兼容的”在线8运行时错误:地图/不相容

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*>运行时错误。问题是什么?

+0

您可以重新格式化您的代码,使其可读,并指定您在标签中讨论的语言?它会帮助你更快地得到答案。 – rfunduk 2010-09-22 18:15:20

+0

C++是语言 – user454563 2010-09-22 18:17:29

+1

'Simulation'不是多图 - multimaps没有'GetTasks()'成员函数。 – bdonlan 2011-08-30 18:26:51

回答

16

我要带胡乱猜测,说的Simulation::GetTasks()签名如下所示:

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

这将创建一个新的多重映射(一复制)每次调用它。

比较迭代器时,multimap<int,Task*>迭代器必须来自同一容器;由于每次拨打GetTasks()时都会收到新副本,因此违反了此​​限制条件,这是您的错误来源。您还有另一个问题 - 临时多图副本在创建语句后被销毁,因此您的迭代器会立即失效。

你有两种选择;一个是捕捉本地副本,并使用该副本一致:

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<int,Task*> &GetTasks(); 

或者const引用:

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

这具有避免的(潜在大)开销的优点复制multimap

请注意,使用const引用需要使用const_iterator来遍历多映射。我建议定义const和非const访问器(除非你想完全不允许直接修改底层multimap,否则C++将根据指针或引用是否为const来选择合适的访问者),在这种情况下,你只能定义const变体。

+0

找到了有用的! – hello 2016-05-28 06:27:00

+0

这是我的问题的解决方案。由成员返回一个std :: multimap作为非引用 – dgrat 2018-01-18 14:10:21