gpt4 book ai didi

c++ - 带有自定义类指针的优先级队列断言错误

转载 作者:行者123 更新时间:2023-11-28 01:03:43 25 4
gpt4 key购买 nike

我正在实现 A* 搜索算法,但我一直遇到优先级队列问题。我已经根据 this article 为优先队列实现了自定义比较器。

这是相关代码:

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 被使用,因为我需要一个用于此算法的最小堆。该实现似乎工作正常,当它在 Release模式下运行时问题消失,但当优先级队列被 pop()ed 时,优先级队列偶尔会在 Debug模式下抛出“无效堆”断言失败。

我不熟悉 STL 中的 binary_function,但问题似乎出在比较器上。删除比较器或将符号更改为 less 然后删除错误,但这会给我一个最大堆。有什么我想念的吗?

最佳答案

感谢您的帮助。事实证明,在更改优先级队列中节点的成本后,我没有重建堆。呼唤

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

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

关于c++ - 带有自定义类指针的优先级队列断言错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7455673/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com