Очередь приоритетов STL в пользовательском классе

У меня много проблем с получением очереди приоритетов, чтобы узнать, какой параметр он должен сортировать. Я перегрузил меньше, чем оператор в своем пользовательском классе, но, похоже, он не использует его. Вот соответствующий код:

Node.h

class Node
{   
public:
    Node(...);
    ~Node();
    bool operator<(Node &aNode);
...
}

Node.cpp

#include "Node.h"
bool Node::operator<(Node &aNode)
{
    return (this->getTotalCost() < aNode.getTotalCost());
}

getTotalCost() возвращает int

main.cpp

priority_queue<Node*, vector<Node*>,less<vector<Node*>::value_type> > nodesToCheck;

Что мне не хватает и/или не так?

Ответы

Ответ 1

less<vector<Node*>::value_type> Означает, что ваш компаратор сравнивает указатели друг с другом, что означает, что ваш вектор будет сортироваться по макету в памяти узлов.

Вы хотите сделать что-то вроде этого:

#include <functional>
struct DereferenceCompareNode : public std::binary_function<Node*, Node*, bool>
{
    bool operator()(const Node* lhs, const Node* rhs) const
    {
        return lhs->getTotalCost() < rhs->getTotalCost();
    }
};

// later...
priority_queue<Node*, vector<Node*>, DereferenceCompareNode> nodesToCheck;

Обратите внимание, что вы должны быть const-correct в своем определении totalCost.

EDIT: теперь, когда С++ 11 здесь, вам больше не нужно наследовать от std:: binary_function (что означает, что вам не нужно использовать #include function)

Ответ 2

Вам нужно сделать свой параметр const, потому что теперь вы даете ему неценовую ссылку, а это значит, что вы можете изменить объект, с которым вы сравниваете. (Который вы нет, и, вероятно, не должен).

Вы не являетесь const-correct. Ваш operator< не вносит изменений в Node, поэтому функция должна быть const:

bool operator<(const Node &aNode) const;

После этого, если у вас возникли проблемы с вызовом функции getTotalCost(), скорее всего, она не является константой. Отметьте его как const, если он еще не был:

int getTotalCost(void) const;

Теперь ваш код (больше) const-correct.

В боковом примечании двоичные операторы обычно реализуются вне класса:

class Node
{
public:
    // ...

    int getTotalCost(void) const;

    // ...
};

bool operator<(const Node& lhs, const Node& rhs)
{
    return lhs.getTotalCost() < rhs.getTotalCost();
}