我有一个包含两个字段的struct
:
struct road {
int from, len ;
};
由于某些原因,我需要按照以下方式对我的road
进行排序:
在数组中按升序
from
排序在优先队列中按升序
len
排序
因此,我已经包含了以下内容:
#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
内部?