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

+0

C++ - это язык – user454563

+1

'Simulation' не является мультимапом. Multimaps не имеют функции' GetTasks() 'member. – bdonlan

ответ

16

Я собираюсь принять диких угадать и сказать, что Simulation::GetTasks() подпись выглядит следующим образом:

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

Это создает новый Multimap (а копия) каждый раз, когда вы называете его.

При сравнении итераторов оба итератора 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, обеспечивая тем же один используется каждый раз, когда:

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

Или константная ссылка:

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

Это имеет то преимущество, что позволяет избежать (потенциально большой) накладных расходов копирование multimap.

Обратите внимание, что для использования ссылки с константой необходимо использовать const_iterator s для перехода через мультимап. Я бы рекомендовал определить как const, так и неконстантные аксессоры (C++ выберет правильный вариант, если указатель или ссылка- const), если вы не хотите полностью исключить прямое изменение базового multimap, и в этом случае вы можете определить только вариант const.

+0

Нашли это полезным !! – hello

+0

Это решение моей проблемы. Вернул std :: multimap членом как не ссылкой – dgrat

 Смежные вопросы

  • Нет связанных вопросов^_^