2013-04-02 2 views
0

Когда я пытаюсь запустить свою программу, я получаю ошибку «map/set iterator not incrementable». Я читал, что это происходит, когда вы аннулируете итератор, но я только редактирую объекты, на которые указывает итератор. Это нормальное поведение? Что я могу сделать с этим? Если удалить эту строку, то нет никакой ошибки:map iterator not incrementable

iterator->second.neighbour[direction] = &(find_iter->second); 

Полный код:

void Gomoku::addUniqueMap(const map_Map& map_to_add) 
{ 
    this->unique_maps.push_front(map_to_add); 

    std::list<map_Map>::iterator map_iter = this->unique_maps.begin(); 
    map_Iterator iterator = map_iter->begin(); 

    for(; iterator != map_iter->end(); ++iterator) 
    { 
     for(int i = 1, direction = 0; i > -2; --i) 
     { 
      for(int j = -1; j < 2; ++j) 
      { 
       if(iterator->second.neighbour[direction] == nullptr) 
       { 
        ++direction; 
        continue; 
       } 
       if(i == 0 && j == 0) 
        continue; 

       COORD pos(iterator->first.x + j, iterator->first.y + i); 
       wrap(pos, this->map_size); 

       map_Iterator find_iter = map_iter->find(pos); 
       if(find_iter != map_iter->end()) 
       { 
        iterator->second.neighbour[direction] = &(find_iter->second); 
       } 

       ++direction; 
      } 
     } 
    } 
} 

'map_Map' - std::map<COORD, Pawn>
'map_Iterator' - std::map<COORD, Pawn>::iterator
'Пешка' -

struct Pawn 
{ 
    Pawn(Player player); 
    Player  player; 
    const Pawn* neighbour[8]; 
}; 
+0

Можете ли вы опубликовать тип 'unique_maps'? Вы также должны попытаться удалить 'auto', код будет более понятным (даже если немного более подробным) (используйте typedefs). Возможно, тип, выведенный компилятором для второго 'auto', не является тем, что мы ожидаем, и вы обращаетесь к итератору' end() '. Кроме того, если размер вашей карты равен 1x1, у вас будет' find_iter' == 'итератор'. – Synxis

+0

@Synxis Я заменил авто с типами, но это не помогло. И я никогда не получаю доступ к 'end()' iterator, я всегда проверяю сначала, если итератор не является end(). –

+0

Никогда не устанавливая итератор для 'end()', не означает, что этот итератор не может принимать значение 'end()' ... – Synxis

ответ

0

Причиной ошибки было то, что я был acce ssing и модификация neighbour[8], поэтому я изменял элемент из диапазона массивов и, возможно, сделал что-то для итератора.
В отладочной версии я получил ошибку map/set iterator not incrementable, в то время как в версии версии итератор версии не может быть увеличен, и это вызвало бесконечную работу программы.

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