我有一个类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
?
答案 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默认使用堆结构作为优先级队列。
最后,我留下了如何处理某个节点的父指针的概念,该节点在任何/部分子节点之前被弹出,被删除,从而创建一个无效指针,指向队列中剩余的任何子节点,但听起来你知道会发生这种情况。