c ++函数指针在传递给push_heap时给出运行时错误

时间:2014-12-06 01:16:44

标签: c++ pointers c++11

我正在实现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的第三个参数是函数指针或函数对象,但它是实际上是它需要的谓词。除非一个函数对象是一个谓词,否则我一直在以错误的方式处理这个问题。

1 个答案:

答案 0 :(得分:0)

调用push_heap()的正确方法是

push_heap(queueVector.begin(), queueVector.end(), ShortestDistToHere());

它需要一个仿函数对象的实例。