我有两个字段的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
中定义一个? 最佳答案
您几乎拥有它。在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
。