我想在稀疏圖上實現最短路徑搜索(這不是一個提升圖,可能無法高效地轉換爲一個),所以我自然堅持使用優先級來實現Dijkstras算法隊列。由於我的圖是一個自定義的,我需要實現的距離比較,因爲一個函數對象,並把它交給隊列:使用自定義值比較器的提升最小隊列
#include <boost/heap/fibonacci_heap.hpp>
#include <iostream>
#include <climits>
#define BIG (INT_MAX/2)
struct node_compare {
std::vector<int> dist;
void set(int node, int d) {
dist[node] = d;
}
node_compare(int dim) : dist(dim, BIG) {};
/* this is a 'greater than' because boost implements max-heaps */
bool operator()(const int& n1, const int& n2) const {
std::cout << "Comparing " << n1 << " < " << n2 << " = " << dist[n1] << " > " << dist[n2] << std::endl;
return dist[n1] > dist[n2];
}
};
typedef boost::heap::fibonacci_heap<int, boost::heap::compare<node_compare>> priority_queue;
int main(int argc, char** argv) {
/* comparator implementation, based on distances */
node_compare cmp(5);
priority_queue pq(cmp);
cmp.set(3, 10);
for (int i = 0; i < 5; i++)
pq.push(i);
while(!pq.empty()) {
std::cout << pq.top() << std::endl;
pq.pop();
}
}
什麼打動我的是,不知何故優先級隊列似乎建立自己的node_compare
實例,儘管我在構造函數中提供了一個實例。這應該不可能,因爲node_compare
沒有默認構造函數...
我知道這看起來有點像「請爲我找到那個bug」 - 問題的種類,但我真的沒有知道我是否錯過了一些重要的C++語義或者提升邏輯。
就是這樣。謝謝。有沒有辦法避免這種複製結構?我不能在構造隊列之後訪問比較器,也不能將它交換到它。或者換句話說:有沒有辦法避免將指針傳遞給我的距離向量? – choeger