我想在C++中實現一個A *搜索函數,並且我在優先級隊列中遇到了很多麻煩。從我可以在網上找到的例子來看,似乎只需要定義一個重載「()」的比較器類;但是,似乎Visual C++編譯器希望爲優先級隊列的元素定義賦值運算符「=」,否則會生成一條錯誤消息,說:Visual C++ 2012:爲什麼priority_queue需要重載賦值運算符?
錯誤C2582:'運算符='功能在'節點'中不可用
指向其源代碼中實現<algorithm>
庫的行。
所以我開始爲'node'類寫一個重載的「=」操作,只是爲了發現「push」操作在某個時候做了一個分配,所以我最終得到了一個相同的'node'對象。
我在這裏錯過了什麼嗎?
下面是相關代碼
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"
標準容器通過複製元素來工作,所以必須有一個「operator =」可用。我不知道編譯器爲什麼抱怨你的情況,除非它真的很聰明,並且推測你應該定義一個「operator =」,因爲指針成員「node * parent」。一般來說,當有指針成員時,默認的「operator =」在語義上是不正確的。 – zentrunix
@JoséX。 msg是「節點」類的公共成員。你能否詳細說明標準容器如何通過複製元素來工作?這可能與爲什麼會發生這種情況有關:\我很好奇,因爲將它們推到別的東西上,如矢量,似乎根本沒有改變內容。 –
user2531913
當您執行「p.push(a)」時,將「a」的副本壓入容器,而不是「a」本身。此外,忘了「味精」,請參閱我上面的編輯。 – zentrunix