2015-11-19 64 views
0

我正在尝试创建一个采用优先级队列并反转优先级的类。我包含一个bool operator<()函数作为该类的成员函数,但无论如何构造此函数,运算符似乎都不会被重载。运营商overloader没有产生影响

这里是我的类:

template<typename T> 
class MinPQ{ 

public: 

    bool empty() const { 
     return pq.empty(); 
    } 

    unsigned int size() const { 
     return pq.size(); 
    } 

    void push(const T& element){ 
     pq.push(element); 
    } 

    const T& min() const { 
     return pq.top(); 
    } 

    void remove_min(){ 
     pq.pop(); 
    } 

    bool operator<(const T& element) const { 
     return pq < element; 
    } 

private: 

    priority_queue<T> pq; 
}; 

编辑

我也试图改变重载函数以下,不undertsand这是为什么也不工作。

bool operator<(const T& element){ 
    return this < element; 
} 
+0

您是如何使用操作符的? – TartanLlama

+0

我刚刚开始研究优先级队列,我认为如果我要包含一个运算符重载成员函数,每当元素被推入队列时,优先级队列会自动按照这个overloader进行排序? – KOB

+1

成员操作符定义将作为参数(默认情况下)_class_类型。您的运营商正在努力将优先队列与该队列中的一个元素进行比较。你应该比较喜欢的东西。 –

回答

1

您的operator<是没有意义的。它唯一能做的就是将MinPQ<T>对象与T对象进行比较。如果要比较两个T对象,你应该这样做:

1)如果模板类型T只能取的种类屈指可数,你可以明确地写比较运营商每种类型:

bool operator<(const T& lhs, const T& rhs) 
{ 
    return lhs > rhs; 
} 

注意:每个operator<应该是非成员函数。或者带有单个参数的类T的成员函数。

2)写一个比较仿函数:

template <class T> struct CompareT 
{ 
    bool operator()(const T& lhs, const T& rhs) const 
    { 
     return lhs > rhs; 
    } 
}; 

然后声明pq成员如下:

priority_queue<T, std::vector<T>, CompareT<T>> mq; 

3)如果你想简单地逆优先级,你可以简单地使用std::greater类:

priority_queue<T, std::vector<T>, std::greater<T>> mq; 
+0

你的选择1是我最初想到的,但是我得到一个错误,说它只需要一个参数? 我明白选项2和3,但是在这种情况下,我必须使用成员函数 – KOB

+1

来完成。您可以阅读如何编写关系运算符:http://en.cppreference.com/w/cpp/language/operators – AlexStepanov

+1

我的意思是你应该写非成员函数。我会解决我的答案。 – AlexStepanov