2010-09-22 21 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