Приоритетная очередь STL и перегрузка указателями
Я впервые использую приоритетную очередь. Я пытаюсь реализовать алгоритм Дейкстры для школы, и я решил, что мне нужна минимальная куча, чтобы сделать это. Сейчас мои узлы-указатели, и я хочу сравнить их вес, но я не думаю, что могу перегрузить > и
Код до сих пор:
priority_queue<Node*, vector<Node*>, node_comparison> minHeap;
И затем у меня есть структура для сравнения Весов узла
struct node_comparison
{
bool operator<( const Node* a, const Node* b ) const
{
return a->totalWeight < b->totalWeight;
}
};
Однако он говорит, что для этого слишком много параметров операторная функция. Я пытался понять, как я мог бы управлять минимальной очередью приоритета кучи с моими узлами в течение некоторого времени и продолжать застревать. Есть идеи?
2 ответа:
Если я правильно понял ваш вопрос, я полагаю, что на самом деле вы хотите сделать
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); }