我正在实现 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)
使用了更大的然后,因为我需要这个算法的最小堆。该实现似乎工作正常,并且当它在发布模式下运行时问题就消失了,但是当优先级队列被 pop() 时,优先级队列偶尔会在调试模式下抛出“无效堆”断言失败。
我不熟悉 stl 中的 binary_function,但问题似乎出在比较器上。删除比较器或将符号更改为 less 可以消除错误,但这会给我一个最大堆。有什么我想念的吗?