我正在实现Djikstra的最短路径算法并使用优先级队列来确定下一个要访问的节点,但我不能使用std :: priority_queue,因为此应用程序需要在适当的位置重建堆。我为函数std::make_heap()
,std::push_heap()
和std::pop_heap()
编写了自己的包装器,并且我将自己的比较器传递给它们,但它在运行时返回空指针错误。我有一种感觉,我要么实际上没有正确传递函数指针,要么函数指针没有被正确初始化。
这是初始化函数指针的代码
bool ShortestDistToHere(const Node& lhs, const Node& rhs){
return distances[lhs.xpos][lhs.ypos] < distances[rhs.xpos][rhs.ypos];
}
bool (*shortestDist)(const Node& lhs, const Node& rhs) = &shortestDistToHere;
这是使用它的函数调用
push_heap(queueVector.begin(), queueVector.end(), shortestDist);
编辑:在评论中,我提到当它试图在谓词上调用某些内容或其他内容时出错。好吧,事实证明,Visual Studio 11并不完全遵循C ++规范(或者文档只是模糊)导致在引用中它说make_heap的第三个参数是函数指针或函数对象,但它是实际上是它需要的谓词。除非一个函数对象是一个谓词,否则我一直在以错误的方式处理这个问题。
答案 0 :(得分:0)
调用push_heap()
的正确方法是
push_heap(queueVector.begin(), queueVector.end(), ShortestDistToHere());
它需要一个仿函数对象的实例。