15

プライオリティ キューがどのパラメーターでソートする必要があるかを認識させるのに苦労しています。カスタム クラスで less than 演算子をオーバーロードしましたが、使用していないようです。関連するコードは次のとおりです。

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;

私は何が欠けているか、間違っていますか?

4

2 に答える 2

24

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

編集:C ++ 11がここにあるので、std :: binary_functionから継承する必要はありません(つまり、#include関数を使用する必要はありません)

于 2009-10-09T03:31:46.733 に答える
15

パラメータを作成する必要がありconstます。現在のところ、コストのない参照を与えているためです。つまり、比較しているオブジェクトを変更する可能性があります。(あなたはそうではなく、おそらくそうすべきではありません)。

あなたはconst-rectではありません。operator<ノードに変更を加えないため、関数は const である必要があります。

bool operator<(const Node &aNode) const;

その後、getTotalCost()関数の呼び出しに問題がある場合は、それも const ではない可能性があります。まだ 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();
}
于 2009-10-09T02:58:38.780 に答える