2014-12-06 48 views
0

我正在實現Djikstra的最短路徑算法並使用優先級隊列來確定接下來訪問哪個節點,但是我不能使用std :: priority_queue,因爲此應用程序需要堆重建到位。我爲函數std::make_heap()std::push_heap()std::pop_heap()編寫了自己的包裝器,我將自己的比較器傳遞給它們,但它在運行時返回空指針錯誤。我有一種感覺,我要麼沒有正確傳遞函數指針,要麼函數指針沒有正確初始化。C++函數指針在傳遞給push_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的第三個參數是一個函數指針或函數對象,但它是實際上是它需要的謂詞。除非一個函數對象是一個謂詞,否則我在整個時間裏都是這樣做的。

+3

什麼是「距離」?你能顯示它的聲明/初始化嗎? – KalyanS 2014-12-06 01:21:58

+0

距離是一個int數組[250] [200],它包含當前到達某個節點的最短距離,要訪問的下一個節點是距離最短的那個節點,如所有非零邊的圖中保證那樣是該節點的最短路徑。 – 2014-12-06 01:25:44

+3

如果是這樣的話,你可能會考慮對數組進行越界訪問,而不一定與函數指針有關。 – KalyanS 2014-12-06 01:31:20

回答

0

調用push_heap()正確的方法是

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

它所需要的仿函數對象的實例。