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"