如果我正確理解你的問題,我相信你真正想要的是讓node_comparison
一個仿(更具體地說,一個二元謂詞):
struct node_comparison
{
bool operator() (const Node* a, const Node* b) const
{
return a->totalWeight < b->totalWeight;
}
};
一個仿函數是一個類,其對象提供的電話運營商(operator()
),因此,可以用一個你想用調用函數相同的語法被調用的過載:
Node* p1 = ...;
Node* p2 = ...;
node_comparison comp;
bool res = comp(p1, p2) // <== Invokes your overload of operator()
內部,std::priority_queue
將像我在上面的代碼片段中那樣或多或少地實例化謂詞,並以此方式調用它來執行其元素之間的比較。
在常規功能仿函數的優點是它們可以容納狀態信息(你可能不會需要的時刻,但結果往往是可取的):
#include <cmath>
struct my_comparator
{
my_comparator(int x) : _x(x) { }
bool operator() (int n, int m) const
{
return abs(n - _x) < abs(m - _x);
}
int _x;
};
例如,上述謂詞根據構造時提供的另一個整數的距離來比較整數。這是它如何被使用:
#include <queue>
#include <iostream>
void foo(int pivot)
{
my_comparator mc(pivot);
std::priority_queue<int, std::deque<int>, my_comparator> pq(mc);
pq.push(9);
pq.push(2);
pq.push(17);
while (!pq.empty())
{
std::cout << pq.top();
pq.pop();
}
}
int main()
{
foo(7);
std::cout << std::endl;
foo(10);
}
什麼是實際的錯誤? – 2013-03-26 20:11:34
在[文檔](http://en.cppreference.com/w/cpp/container/priority_queue/priority_queue)中,請參閱[示例](http://en.cppreference.com/w/cpp/container/ priority_queue/priority_queue#示例),它使用['std :: less'](http://en.cppreference.com/w/cpp/utility/functional/less)。你需要爲'Node *'實現[類似的東西](http://en.cppreference.com/w/cpp/utility/functional/less#Possible_implementation)。 –
2013-03-26 20:21:18