Приоритетная очередь 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 6

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);
}

Вам понадобится ваш функтор сравнения для реализации bool operator()(....), а не bool operator<(....):

struct node_comparison 
{
   bool operator()( const Node* a, const Node* b ) const 
   {
    return a->totalWeight < b->totalWeight;
   }
};