priority_queue中相互指向的对象
priority_queue of objects that point to each other
我有一个类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默认情况下使用优先级队列的堆结构)。
最后,我将如何处理某个节点的父指针在其任何/某些子节点被删除之前弹出,从而创建一个指向队列中任何子节点的无效指针的概念留给您,但听起来您知道这可能会发生。
相关文章:
- 什么时候调用组成单元对象的析构函数
- 对RValue对象调用的LValue ref限定成员函数
- CMake-按正确顺序将项目与C运行时对象文件链接
- 空基优化子对象的地址
- 将对象数组的引用传递给函数
- 你能重载对象变量名本身返回的内容吗
- C++使用整数的压缩数组初始化对象
- 找不到成员对象:没有名为get_event()的成员,也处理多态性和向量
- 将对象移动到std::shared_ptr
- 代理对象的常量正确性
- 提升 ASIO 无法识别计时器对象
- 将Ref对象作为类成员
- 将包含C样式数组的对象初始化为成员变量(C++)
- 如何返回一个类的两个对象相加的结果
- MyClass obj = MyClass();'MyClass()'在这里指的是临时对象吗?
- 如何通过 COM 互操作访问复杂对象的属性?
- 如何破坏包含自指指针的对象
- 跨 C# 和 COM 互操作使用对象C++
- 使用C++中的COM互操作对象
- C#COM互操作:公开以托管对象为参数的函数