自定义类指针的优先级队列断言错误
Assertion error on priority queue with custom class pointers
我正在实现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都解决了这个问题。
相关文章:
- boost::进程间消息队列引发错误
- 如果我只是不访问queue_front节点的子节点,而是将它们推到队列中呢?还是BFS吗
- Android NDK传感器向事件队列报告奇怪的间隔
- C++优先级队列,按对象的唯一指针的特定方法升序排列
- 按对象的特定方法按升序排列的C++优先级队列
- 使用2个键的cpp-stl::优先级队列排序不正确
- 我是否需要在下一次转移时将所有权*转移回转移队列
- 在一个读写器队列中,我可以用volatile替换原子吗
- 为什么我的多线程作业队列崩溃
- 尝试将lambda函数放在队列中时出现一般分配器错误(可能是与unique_ptr有关的错误)
- 使用"Task"函数指针队列定义作业管理器
- 在c++队列中使用pop和visit实现线程安全
- 为什么我需要C++中不同的排序格式来对这个USACO代码上的数组和优先级队列进行排序
- 打印优先级队列
- 尝试使用 std::vector<std::thread时出现静态断言失败错误>
- 共享队列的线程安全
- Boost 无锁队列断言用于简单的赋值和析构函数
- 在尝试使用boost时断言.跨很多过程中的互动消息队列
- 自定义类指针的优先级队列断言错误
- 使用优先级队列时C++调试断言失败,表达式:无效堆