自定义类指针的优先级队列断言错误

Assertion error on priority queue with custom class pointers

本文关键字:队列 断言 错误 优先级 指针 自定义      更新时间:2023-10-16

我正在实现a *搜索算法,但我一直遇到优先级队列的问题。根据本文

,我为优先级队列实现了一个自定义比较器。

这是相关代码:

class CNode;
struct CompareNode : public binary_function<CNode*, CNode*, bool> {
    bool operator()(const CNode* lhs, const CNode* rhs) const {
        return lhs->m_costFromStart+lhs->m_heuristic > rhs->m_costFromStart+rhs->m_heuristic;
    }
};

bool AStarSearch(CNode* start, CNode* end) {
    priority_queue<CNode*, vector<CNode*>, CompareNode> open;
    ...
}

调用堆栈:

std::_Debug_heap ...
std::pop_heap ...
std::priority_queue<CNode *,std::vector<CNode *,std::allocator<CNode *> >,CompareNode>::pop()
AStarSearch(CNode * start=0x0f9a23b8, CNode * end=0x0f9a24e8)

Greater then被使用,因为我需要这个算法的最小堆。实现似乎工作得很好,当它在发布模式下运行时,问题就消失了,但优先级队列偶尔会抛出"无效堆"。当优先级队列为pop()时,调试模式下断言失败。

我不熟悉stl中的binary_function,但问题似乎在于比较器。删除比较器或将符号更改为less,然后删除错误,但这会给我一个最大堆。我是不是漏掉了什么?

谢谢你的帮助。事实证明,在更改优先级队列中节点的成本之后,我没有重新构建堆。调用

make_heap(const_cast<CNode**>(&open.top()), const_cast<CNode**>(&open.top()) + open.size(), 
CompareNode());

每次修改后pq都解决了这个问题。