2013-12-16 218 views
1

我認爲我錯誤地創建了這對,因爲我在使用DDD進行調試時遇到段錯誤。任何人都可以看到我犯了什麼錯誤嗎?謝謝!處理輸入文件時,段錯誤發生:如何初始化一對

char vertex = 'a'; 
Vertex* newVertex = new Vertex(); 
map.insert(pair<char,Vertex*>(vertex,newVertex)); 

代碼:

void MSTapp::processFile() 

{ 

int pos1; 

int pos2; 

map<char, Vertex*> adjacencyList; 

vector<char> listOrder; 

string input; 

bool test = false; 

while (getline(cin, input)) { 

    pos1 = pos2 = 0; 

    if(std::string::npos != input.find_first_of("")) 

    { 



     char source = input[0]; 

     char destination = input[2]; 

     stringstream ss(input.substr(4));  

     int weight; 

     ss >> weight; 

     Edge newEdge(destination, weight); 

     adjacencyList[source]->addEdge(destination, newEdge); 

     Edge roadBack(source, weight); 

     adjacencyList[destination]->addEdge(source, roadBack); 

    } 

    else 

    { 

     while(input.find(' ', pos1) != string::npos) 

     { 

      pos2 = input.find(' ', pos1); 

      char vertex = input[pos1]; 

      listOrder.push_back(vertex); 

      Vertex* newVertex = new Vertex(vertex); 

      adjacencyList[vertex] = newVertex; 

      pos1 = pos2; 

     }; 

    }; 

}; 

Graph graph(listOrder, adjacencyList); 

prim(graph, adjacencyList[listOrder[0]]); 

}

輸入:

A B C D E F G 
A B 3 
A E 4 
B C 7 
B E 6 
B F 5 
C D 9 
C F 8 
D F 9 
D G 4 
E F 6 
F G 8 
+0

你在哪一行得到你的段錯誤? –

+0

你可能不需要指針。只要'pair '通常應該這樣做,否則就是智能指針。 – chris

+0

我在map.insert行添加了segfault。我正在嘗試爲無向圖創建一個鄰接列表,以便我可以將prim的算法應用於創建最小生成樹 – CodeManiak

回答

2

有項目添加到std::map<K,V>的幾種方法。最常見的一種是使用索引運算符,就像這樣:

map[vertex] = newVertex; 

你也可以做一對明確通過調用std::make_pair

map.insert(std::make_pair(vertex,newVertex)); 

注意,你不需要指定類型參數該對正在創建,因爲std::make_pair推斷上下文中的類型。

+1

,當然['emplace'](http://en.cppreference.com/w/cpp/container/map/emplace) – 2013-12-16 04:20:46

0

如果您能夠編譯但在此問題上出現內存錯誤,我會查看您的 std::map<char, Vertex *, ...>的比較函數。 STL的映射應該是一個紅黑平衡二叉樹,它在插入和重新平衡自身時節點的比較小於/不小於比較。我猜想你要麼有一個錯誤的節點比較函數,要麼Vertex成員有時包含在 insert()調用中被比較函數接觸的壞指針。另外,如上所示調用std :: map實例'map'可能會令人困惑,即使在示例形式中也是如此。

編輯:nevermind,剛剛看到上面添加的代碼,並且您對地圖定義/比較功能沒有任何興趣。

如果您在以下兩行之一中崩潰,這意味着您的節點查找失敗,並且您嘗試修改實際不存在的對象。檢查這些值(頂點*)嘗試讀取或修改之前:

adjacencyList[source]->addEdge(destination, newEdge); 
adjacencyList[destination]->addEdge(source, roadBack); 

將斷點在你的頂點:: addEdge(字符,頂點*)調用,看看this的地址和內容展示。 std::map::operator[]將無聲地創建一個元素(使用默認構造函數)作爲失敗查找上的一個鍵,所以您可能會創建null Vertex * s,然後嘗試向它們添加元素。