我知道我可以priority_queue < P, vector<P>, Compare > queue;
,其中Compare
是一个仿函数。但由于默认比较器为less<P>
,并且与<
相同,因此当我执行以下操作时,为什么它不起作用:
typedef pair<int, int> P;
bool operator<(const P& a, const P& b){
return (a.second < b.second);
}
int main(int argc, char const *argv[]){
int vec[] = {3, 6, 7, 8, 1, 2}; // just for testing
priority_queue <P> queue;
for(int i = 0; i < 6; ++i){
queue.push(make_pair(i, vec[i]));
}
cout << queue.top().second << endl; // returns 2
return 0;
}
答案 0 :(得分:6)
std::pair
已有operator<
declared inside namespace std。
由于它与pair
位于同一名称空间,std::less
会先找到一个,然后再查看。
答案 1 :(得分:1)
这是执行此操作的正确方法:
#include <utility>
#include <queue>
#include <vector>
#include <iostream>
using namespace std;
typedef pair<int, int> P;
struct comp {
bool operator()(const P& a, const P& b){
return (a.second < b.second);
}
};
int main(int argc, char const *argv[]){
int vec[] = {3, 6, 7, 8, 1, 2}; // just for testing
priority_queue <P, std::vector<P>, comp> queue;
for(int i = 0; i < 6; ++i){
queue.push(make_pair(i, vec[i]));
}
cout << queue.top().second << endl; // returns 2
return 0;
}
答案 2 :(得分:-1)
namespace std {
bool operator<(const P& a, const P& b) {
return (a.second < b.second);
}
}
它对我有用
UPD: 我们可以为安全性定义自己的类型:
class MyOwnPair: public std::pair<int,int>{};
typedef MyOwnPair P;