对象的priority_queue指向彼此

时间:2012-11-23 19:00:16

标签: c++ pointers std priority-queue

我有一个类Node,除了存储数据外,还有一个指向其父Node的指针。我将一些节点存储在priority_queue中并覆盖<运算符以进行比较。

class Node {
public:
    string name;
    Node *parent;
    int cost;
};

static bool operator<(const Node& lhs, const Node& rhs) {
    return lhs.cost < rhs.cost;
}
priority_queue<Node> queue;

问题是,父指针似乎搞砸了。我的猜测是,当我从队列中弹出Node时,Nodes实际上已经在内存中向上移动,而指针指向错误的Nodes。这可能吗?

我尝试使用priority_queue Node*指针(并使用new创建它们),以便只重新排序指针,而不是对象本身。这似乎解决了指针问题,但现在队列按内存地址排序,而不是Nodes的成本。

如何实现具有彼此指向的对象的priority_queue

1 个答案:

答案 0 :(得分:3)

使用Node*和队列的自定义比较器。根据您目前的情况,您可以执行以下操作,但我建议您使用智能指针,如果它们在您当前的工具链中可用。

class Node {
public:
    string name;
    Node *parent;
    int cost;
};

class CompareNodePtr
{
public:
    bool operator ()(const Node*& left, const Node*& right) const
    {
        return left->cost < right->cost;
    }
};

// your priority queue with custom comparator.
std::priority_queue<Node*, std::vector<Node*>, CompareNodePtr> myqueue;

或者,为了更加本地定义比较器,您可以在Node中填充compare-my-pointer类,以免污染全局命名空间:

class Node {
public:
    string name;
    Node *parent;
    int cost;

    struct ComparePtr
    {
        bool operator ()(const Node*& left, const Node*& right) const
        {
            return left->cost < right->cost;
        }
    };
};

// your priority queue with custom comparator.
std::priority_queue<Node*, std::vector<Node*>, Node::ComparePtr> myqueue;

关于指向“混乱”的指针,使用对象级存储(与上面的指针存储相反),优先级队列可以/每次在弹出后重新堆叠内容时移动元素(如果你我不知道,标准的lib默认使用堆结构作为优先级队列。

最后,我留下了如何处理某个节点的父指针的概念,该节点在任何/部分子节点之前被弹出,被删除,从而创建一个无效指针,指向队列中剩余的任何子节点,但听起来你知道会发生这种情况。