Я использую 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;
Я не знаю, почему есть разница. Будем признательны любому совету.
Учитывая следующий ответ, я пробовал разные способы, чтобы запустить свой код, они работают:
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;
Версия 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 queue;' –