[英]RunTime Error : map/set iterators incompatible
我在第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<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
來逐步執行multimap。 我建議定義const和非const訪問器(C ++將根據Simulation
指針或引用是否為const來選擇正確的訪問器),除非您想要完全禁止直接修改底層multimap
,在這種情況下您只能定義const
變體。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.