运算符重载器没有影响
Operator overloader not making an affect
我正在尝试创建一个 class,它采用优先级队列并反转优先级。我包含一个 bool operator<()
函数作为 class 的成员函数,但无论我如何构造这个函数,运算符似乎永远不会被重载。
这是我的 class:
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;
};
编辑
我也试过将重载函数更改为以下内容,但不明白为什么它也不起作用。
bool operator<(const T& element){
return this < element;
}
你的operator<
毫无意义。它唯一能做的就是比较 MinPQ<T>
对象和 T
对象。如果你想比较两个 T
对象,你应该这样做:
1) 如果模板类型 T
只能采用少数几种类型,您可以为这些类型中的每一种显式编写比较运算符:
bool operator<(const T& lhs, const T& rhs)
{
return lhs > rhs;
}
注意:每个operator<
应该是一个非成员函数。或 class 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
class:
priority_queue<T, std::vector<T>, std::greater<T>> mq;
我正在尝试创建一个 class,它采用优先级队列并反转优先级。我包含一个 bool operator<()
函数作为 class 的成员函数,但无论我如何构造这个函数,运算符似乎永远不会被重载。
这是我的 class:
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;
};
编辑
我也试过将重载函数更改为以下内容,但不明白为什么它也不起作用。
bool operator<(const T& element){
return this < element;
}
你的operator<
毫无意义。它唯一能做的就是比较 MinPQ<T>
对象和 T
对象。如果你想比较两个 T
对象,你应该这样做:
1) 如果模板类型 T
只能采用少数几种类型,您可以为这些类型中的每一种显式编写比较运算符:
bool operator<(const T& lhs, const T& rhs)
{
return lhs > rhs;
}
注意:每个operator<
应该是一个非成员函数。或 class 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
class:
priority_queue<T, std::vector<T>, std::greater<T>> mq;