为什么我不能简单地覆盖<在成对的优先级队列?

时间:2016-12-22 12:14:12

标签: c++ priority-queue

我知道我可以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;
}

3 个答案:

答案 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;