我正在使用priority_queue來解決問題。 我打算以下面的方式聲明我的節點。爲什麼我不能把比較器放在節點內?
struct node{
int x, y, val;
node(int _x, int _y, int _val){
x = _x;
y = _y;
val = _val;
}
bool operator < (const node& rhs) const{
return val > rhs.val;
}
};
,並在下面的方式來使用它:
priority_queue<node, vector<node>, node> queue;
但它不工作。
然後,我切換到另一種方式。有用。
struct node{
int x, y, val;
node(int _x, int _y, int _val){
x = _x;
y = _y;
val = _val;
}
};
struct com{
bool operator() (const node& lhs, const node& rhs) const{
return lhs.val > rhs.val;
}
};
priority_queue<node, vector<node>, com> queue;
我不知道爲什麼有差異。任何建議都會很棒。
考慮下面的答案,我已經嘗試了不同的方式來運行我的代碼,它們的工作原理:
版本1
struct node{
int x, y, val;
node(int _x, int _y, int _val){
x = _x;
y = _y;
val = _val;
}
node(){}
bool operator() (const node& lhs, const node& rhs) const{
return lhs.val > rhs.val;
}
};
priority_queue<node, vector<node>, node> queue;
版本2:
struct node{
int x, y, val;
node(int _x, int _y, int _val){
x = _x;
y = _y;
val = _val;
}
bool operator < (const node& rhs) const{
return val > rhs.val;
}
};
priority_queue<node, vector<node>, less<node>> queue;
//or
//priority_queue<node, vector<node>> queue;
//or
//priority_queue<node> queue;
,它不是'操作符()'被定義。你可以使用'std :: less'來使其工作,或者只是省略了編譯器。 –
StoryTeller
您是否注意到'node'結構中的比較運算符和'com'結構中的函數調用運算符之間有什麼區別?像一個是***比較運算符***,另一個是***函數調用***運算符? –
不是你需要第一個例子中的額外的模板參數,因爲那麼將會使用使用'<'運算符的默認'std :: less'。所以在第一個例子中,你需要的是'priority_queue隊列;' –