優先度キューで並べ替えるパラメータを認識させるのに多くの問題があります。カスタムクラスのless演算子をオーバーロードしましたが、使用していないようです。関連するコードは次のとおりです。
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;
何が欠けているか、間違っているのですか?
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;
totalCost
の定義ではconst-correctである必要があることに注意してください。
編集:C++ 11がここにあるので、std :: binary_functionから継承する必要はありません(つまり、#include関数を使用する必要はありません)
パラメータをconst
にする必要があります。これは、現時点では非コスト参照を指定しているためです。つまり、比較対象のオブジェクトを変更する可能性があります。 (あなたはそうではなく、おそらくそうすべきではありません)。
あなたはconst-correctではありません。 _operator<
_はノードに変更を加えないため、関数はconstである必要があります。
_bool operator<(const Node &aNode) const;
_
その後、getTotalCost()
関数の呼び出しに問題がある場合は、constでもない可能性があります。まだの場合は、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();
}
_