2015-05-23 2 views
0

Я получаю это сообщение об ошибке map/set iterator not dereferencable При попытке получить значение по ключу в multimap. В этом коде я пытаюсь показать неориентированный граф, представленный список смежности (vector<Vertex*> vertexList)map/set итератор не разменяем. Multimap container isse

void NonOrGraph::show() { 

    cout << endl; 
    multimap<int, int> used; 
    for (int i = 0; i < vertexList.size(); i++) { 
     if (vertexList[i]->adjMap.empty()) { 
      cout << vertexList[i]->index << " isolated"; 
     } else { 
      for(map<Vertex*, int>::iterator it = vertexList[i]->adjMap.begin(); 
               it != vertexList[i]->adjMap.end(); 
               it++) 
      { 

       int from = vertexList[i]->index; 
       int to = it->first->index; 
       int weight = it->second; 

       used.insert(pair<int, int>(from, to)); 
       if (used.find(to)->second != from) { 
        cout << from << " <--(" << weight << ")--> " << to << endl; 
       } 
      } 
     } 
    } 

    cout << "\n\n"; 

} 
+0

Пожалуйста, пост [Минимум, полный, Проверяемость пример] (http://www.stackoverflow.com/help/mcve). – Barry

ответ

0

Проблема, скорее всего, здесь:

if (used.find(to)->second != from) { 

Если to не в used, used.find()used.end() вернется, которые вы затем разыскиваете. Неопределенное поведение позволяет разыменовать итератор end(), который в этом случае проявляется в предоставлении вам ошибки времени выполнения.

Вы должны проверить итератор против end() первого:

std::multimap<int, int>::iterator multi_it = used.find(to); 
if (multi_it != used.end() && multi_it->second != from) { 
//      ^^^^^^^^^^^^^^^^^^^^ 
//      now, it's safe to dereference 
+0

thx, но необходимый элемент может быть в конце карты. Это лучший способ преодолеть этот случай, добавив в конце некоторую символическую ценность? – Arsen

+0

@Arsen 'end()' не означает, что это последний элемент на карте, это значит, что это не карта. – Barry

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