[英]Why can't I put the comparator inside the node?
我正在使用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;
node
不是默認可構造的,並且沒有operator()
由於您使用的是operator<
,因此無需指定比較器,因為默認值是std::less<T>
,如果可用,它將使用它。 而且,如果不需要指定比較器,則無需指定容器,因為std::vector<T>
已經是默認設置。
priority_queue<node, vector<node>, less<node>> queue;
// same as
priority_queue<node, vector<node>> queue;
// also same as
priority_queue<node> queue;
在第一種情況下, node
本身不是比較器,而是為operator<
提供了重載,因此您應該使用以下方法:
priority_queue<node, vector<node>> queue;
沒有任何第三論點。 那應該工作。
請注意, 比較器是可以通過以下方式調用的比較器 :
cmp(x,y)
因此,從這個意義上講,您的類node
不支持該功能,但是它支持以下功能:
x < y
這是另一回事,因此可以與std::priority_queue
使用的默認比較器std::less<T>
使用。
priority_queue
在評估期間從字面上調用com(arg1, arg2)
。
該函數需要作為函數對象(在您的示例中有效),靜態函數或lambda可用。 您的第一個struct
沒有這些。
因為第三個模板參數僅接受compareFunction(objA,objB)格式。 默認情況下,它是class Compare = std::less<typename Container::value_type>
,其中std :: less調用operator <()。
下面的代碼應該工作
std::priority_queue<node, std::vector<node>> queue;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.