0

C++ で A* 検索関数を実装しようとしていますが、プライオリティ キューで多くの問題が発生しています。私がオンラインで見つけることができる例から、オーバーロードされた「()」を持つコンパレータークラスのみを定義する必要があるようです。ただし、Visual C++ コンパイラは、優先度キューの要素に対して定義された代入演算子「=」を必要としているようです。そうしないと、次のようなエラー メッセージが生成されます。

エラー C2582: 'operator =' 関数は 'node' では使用できません

<algorithm>ライブラリを実装するソースコード内の行を指します。

そのため、「ノード」クラスのオーバーロードされた「=」操作を書き始めましたが、「プッシュ」操作がある時点で割り当てを行うことがわかったため、同一の「ノード」オブジェクトのキューになってしまいました。

ここで何か不足していますか?

以下は関連するコードです

node.h

#include <string>
#include <ostream>
//node used in the A* search
struct node{
public:
    friend void operator<<(std::ostream& o,node& n);
    node(std::string& s):msg(s),gScore(0),hScore(0),parent(nullptr){};
    int getHeuristics( node& n);
    bool operator==(node n){return n.msg.compare(msg)?false:true;};
    node& operator=(node& n){msg = n.msg;gScore = n.gScore;hScore = n.hScore; return *this;};
    void setG(int g){gScore = g;}
    int getG(void) {return gScore;}
    int getH(void) {return hScore;}
    int getOverall(void){return hScore + gScore;}
    node* getParent(void){return parent;}
    std::string& msg;
private:
    node* parent;
    int gScore;
    int hScore;
};

WordLadder.c (その一部。「コンパレーター」は特定の方法でノードを比較するだけです):

    string apple("apple");
    string shite("shite");
    string germanApple("apfel");
    node germanNode(germanApple);
    node a(apple);
    node b(shite);
    a.getHeuristics(germanNode);
    b.getHeuristics(germanNode);
    priority_queue<node,vector<node>,comparitor> p;
    p.push(a);
    //cout<<b;
    p.push(b);
    cout<<b; //prints "apple"
4

2 に答える 2