2013-12-18 116 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.