我有一个struct
有两个字段:
struct road {
int from, len ;
};
出于某种原因,我需要能够订购我的road
s:
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
内?
你几乎拥有它。在std::sort
你需要一个你可以称之为operator()
的物体。运用
bool cmpFrom (const road & a, const road & b) {
return (a.from < b.from) ;
}
std::sort(trips, trips + nbRoads, &cmpFrom);
因为函数指针可以像函数一样使用。当你改变cmpFrom
struct cmpFrom {
bool operator () (const road & a, const road & b){
return (a.from < b.from) ;
}
};
你不能再使用std::sort(trips, trips + nbRoads, &cmpFrom);
,因为你不能将&
应用于类型名称。相反,你需要做的是得到一个cmpFrom
的对象,你就这样做
std::sort(trips, trips + nbRoads, cmpFrom{});
现在priority_queue
和sort
都可以使用cmpFrom
。
将两者定义为结构更容易,因为您始终可以从类型创建对象,并且它将按预期运行,但从函数获取类型并使其充当函数的调用者则要困难得多。
事实上你几乎与struct cmpFrom
在那里。但是,您已经正确地注意到std::sort
需要比较器对象(例如函数),而不是类型。当然,在&cmpFrom
是一个类型的cmpFrom
是无效的C ++。相反,您需要创建该类型的对象;由于定义了operator()
,该对象将可调用并执行您想要的操作。所以就这样打电话给std::sort
:
std::sort(trips, trips + nbRoads, cmpFrom{});
std::sort
函数和std::priority_queue
类模板需要两个不同的东西:sort
想要一个可调用的对象,而priority_queue
模板想要一个类型,它允许创建对象。
因此,sort
比priority_queue
更具杂食性 - 你可以将其与函数或函子一起使用。你唯一需要的是为它提供一个真实的对象(当你在你的代码中,你试图获取一个类型的地址,这是没有意义的)。
要在您的示例中修复它,只需将代码更改为
std::sort(trips, trips + nbRoads, cmpFrom{});