簡體   English   中英

RunTime錯誤:map / set迭代器不兼容

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM