【问题标题】:Priority Queue of pointers C++指针优先队列 C++
【发布时间】:2013-12-18 23:47:12
【问题描述】:
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();

我遇到了分段错误,但我不明白它为什么会发生。提前致谢。

【问题讨论】:

  • 您不应该改变优先级队列的内容。特别是不涉及确定元素之间的相对优先级的任何内容。换句话说,不要这样做:nodes[6]-&gt;distance=1;
  • 分段错误通常是内存损坏,并且可能发生在远离错误的地方。您的代码可能在别处有误。
  • 谁清理 Node.edges?

标签: c++ pointers segmentation-fault priority-queue


【解决方案1】:

我加了

#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]-&gt;distance=1; 行不会导致节点 6 下一个 pop();它仍然在那里弹出节点 4,但随后先用节点 6 重新排序队列的其余部分,然后是 5,然后是 7。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-07-13
    • 1970-01-01
    • 1970-01-01
    • 2013-03-16
    • 1970-01-01
    • 2010-12-28
    • 2012-03-28
    • 1970-01-01
    相关资源
    最近更新 更多