priority_queue中相互指向的对象

priority_queue of objects that point to each other

本文关键字:对象 互指 queue priority      更新时间:2023-10-16

我有一个类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。这可能是吗?

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

如何实现对象相互指向的priority_queue

为队列使用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;

或者,对于比较器的更局部的定义,您可以将compare my指针类填充到Node中,以免污染全局名称空间:

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默认情况下使用优先级队列的堆结构)。

最后,我将如何处理某个节点的父指针在其任何/某些子节点被删除之前弹出,从而创建一个指向队列中任何子节点的无效指针的概念留给您,但听起来您知道这可能会发生。