У меня есть struct
с двумя полями:
struct road {
int from, len ;
};
По какой-то причине мне нужно иметь возможность заказать мои road
s:
Таким образом, я включил:
#include <iostream>
#include <algorithm>
#include <queue>
#include <vector>
Я сталкивался с сайтами, предлагающими перегрузить operator<
, но из-за двух возможных порядков, которые просто кажутся неправильными, и это может решить только один из двух.
Путем возиться сучебники, я получил это на работу:
bool cmpFrom (const road & a, const road & b) {
return (a.from < b.from) ;
}
struct cmpLen {
bool operator () (const road & a, const road & b){
return (a.len < b.len) ;
}
};
Для использования с:
std::sort(trips, trips + nbRoads, &cmpFrom) ;
std::priority_queue<road, std::vector<road>, cmpLen> pickRoad ;
Где trips
, конечно, road []
.
Этопрекрасно компилируется (не пробовал запускать его, но это должно быть хорошо), но кажется странным определять два очень похожих компаратора двумя совершенно разными способами, так что, разве нет способа определить оба метода сравнения одинаково?
Изменение определения cmpFrom
на
struct cmpFrom {
bool operator () (const road & a, const road & b){
return (a.from < b.from) ;
}
};
Дает
chantier.cpp: In function ‘int main()’:
chantier.cpp:38:48: error: expected primary-expression before ‘)’ token
std::sort(trips, trips + nbRoads, &cmpFrom) ;
Что, как я предполагаю, означает "Вы дали мтипа, когда я ожидал ссылку ".
Во время записи
bool cmpLen (const road & a, const road & b) {
return (a.len <= b.len) ;
}
Дает
chantier.cpp: In function ‘int main()’:
chantier.cpp:52:56: error: type/value mismatch at argument 3 in template parameter list for ‘template<class _Tp, class _Sequence, class _Compare> class std::priority_queue’
std::priority_queue<road, std::vector<road>, cmpLen> pickRoad ;
^
chantier.cpp:52:56: note: expected a type, got ‘cmpLen’
chantier.cpp:56:30: error: request for member ‘top’ in ‘pickRoad’, which is of non-class type ‘int’
...
Есть ли способ заставить один из этих методов сравнения работать дляоба контейнера?Или, возможно, существует третий способ сделать это, который мог бы работать с обоими?
Что если бы мне нужно было использовать один и тот же порядок для обоих контейнеров?Потребовалось бы дважды определить один и тот же метод сравнения, но с одним внутри struct
?