2013-12-18 153 views
0
class Edge; 

class Node 
{ 
     public: 
     Node(): distance(numeric_limits<double>::infinity()), visited(false) {} 
     Node(string a_id): distance(numeric_limits<double>::infinity()), visited(false), id(a_id) {} 
     bool operator==(const Node& p) {return p.id == id; } 


     string id; 
     double distance; 
     bool visited; 
     string previous; 
     vector<Edge*> edges; 
}; 

class Edge 
{ 
    public: 
     Edge(double weight, string id) 
     { 
      this->weight = weight; 
      dest = new Node(id); 
     } 
     double weight; 
     Node * dest; 

}; 
class Comparator { 
public: 
    bool operator()(const Node* a, const Node* b) 
    { 
     return (a->distance > b->distance); 
    } 
}; 

這些是我的課程。我從節點指針矢量創建了一個優先級隊列:指針C++的優先級隊列

priority_queue<Node*, vector<Node*>, Comparator > queue; 

但是在一些操作之後,我得到了段錯誤。

queue.push(nodes[0]); 
queue.pop(); 
queue.push(nodes[1]); 
queue.push(nodes[4]); 


queue.pop(); 
queue.push(nodes[3]); 
queue.push(nodes[5]); 

queue.pop(); 
queue.push(nodes[6]); 
queue.push(nodes[7]); 
nodes[6]->distance=1; 
queue.pop(); 

在最後一行

 queue.pop(); 

我得到一個分段錯誤,爲什麼它發生,我不明白這一點。提前致謝。

+3

您不應該改變優先級隊列的內容。特別是不涉及確定元素之間相對優先級的任何事情。換句話說,不要這樣做:'節點[6] - >距離= 1;' – juanchopanza

+0

分段錯誤通常是內存損壞,並且可能發生的問題遠離出現錯誤的地方。你的代碼在別處可能是錯的。 –

+0

誰清理Node.edges? – JimR

回答

0

我加

#include <limits> 
#include <queue> 
#include <string> 
#include <vector> 
using namespace std; 

到文件的頂部,使用以下的main():

int main(int argc, char* argv[]) 
{ 
    priority_queue<Node*, vector<Node*>, Comparator > queue; 
    vector<Node> vnode(10); 
    vector<Node*> nodes(10); 
    for (int i = 0; i < 10; ++i) 
    { 
     vnode[i].distance = i; 
     nodes[i] = &vnode[i]; 
    } 

    queue.push(nodes[0]); 
    queue.pop(); 
    queue.push(nodes[1]); 
    queue.push(nodes[4]); 


    queue.pop(); 
    queue.push(nodes[3]); 
    queue.push(nodes[5]); 

    queue.pop(); 
    queue.push(nodes[6]); 
    queue.push(nodes[7]); 
    nodes[6]->distance=1; 
    queue.pop(); 
} 

它編譯和無段錯誤運行,所以我猜你的節點AREN全部初始化?此外,行nodes[6]->distance=1;未導致下一個節點6到pop();它仍然在那裏彈出節點4,但是然後先用節點6首先對隊列的其餘部分進行重新排序,然後是5,然後是7.