Очередь приоритетов 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();
}