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);
}
};
这些是我的课程。我从节点指针的向量创建了一个优先级队列:
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();
我遇到了分段错误,我不知道为什么会发生这种错误。提前谢谢。
答案 0 :(得分: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();
}
它编译并运行没有段错误,所以我猜你的节点都没有全部初始化?此外,行nodes[6]->distance=1;
未导致节点6接下来pop()
;它仍然在那里弹出节点4,但随后首先用节点6重新排序队列的其余部分,然后是5,然后是7。