Ich verwende priority_queue, um ein Problem zu lösen. Ich beabsichtige, meinen Knoten folgendermaßen zu deklarieren.Warum kann ich den Komparator nicht innerhalb des Knotens setzen?
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;
}
};
und es auf folgende Weise verwenden:
priority_queue<node, vector<node>, node> queue;
Aber es funktioniert nicht.
Dann wechsle ich auf einen anderen Weg. Es klappt.
Ich weiß nicht, warum es einen Unterschied gibt. Jeder Rat wäre großartig.
In Anbetracht der folgenden Antwort, ich habe verschiedene Wege versucht, meinen Code auszuführen, sie funktioniert:
Version 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;
Version 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;
Da in Ihrem Knoten arbeitet, ist es nicht 'Operator()', dass definiert ist. Sie können einfach 'std :: less' verwenden, damit es funktioniert, oder den Comprator einfach weglassen. –
StoryTeller
Kennen Sie keinen Unterschied zwischen dem Vergleichsoperator in der 'node' Struktur und dem Funktionsaufrufoperator in der' com' Struktur? So wie einer der *** Vergleichsoperator *** und der andere ein *** Funktionsaufruf *** Operator? –
Nicht, dass Sie das zusätzliche Template-Argument im ersten Beispiel brauchen, weil dann der Standard 'std :: less' verwendet wird, der den Operator' <'verwendet. Im ersten Beispiel brauchen Sie also nur 'priority_queue queue; ' –