我有一个名为Customer的类,它正在重载<操作者:
bool Customer::operator<(const Customer &other) {
return this->price < other.price;
}
但是当我尝试初始化优先级队列时,我得到了错误页面。
Customer c1(10,5,12,30);// last parameter is price
Customer c2(10,5,12,2);
priority_queue<Customer , vector<Customer> , less<Customer> > barQ;
barQ.push(c2);
barQ.push(c1);
cout<<barQ.top().price;
然后,我意外地发现当我按照以下方式初始化它时:
Customer c1(10,5,12,30);
Customer c2(10,5,12,2);
priority_queue<Customer* , vector<Customer*> , less<Customer*> > barQ;
barQ.push(&c2);
barQ.push(&c1);
cout<<barQ.top()->price;
我没有错误,效果很好。 所以我的问题是客户与客户之间的区别是什么?顾客*? 当我向客户声明它时,我认为它应该工作,而不是客户*,为什么它会起作用呢?
答案 0 :(得分:0)
const
重载
operator
bool operator<(const Customer &other) const {
return this->price < other.price;
}
您也可以使用自己的比较器代替std::less
。以下是我们如何编写它。
template<typename type>
struct mycomp {
bool operator()(const type & first, const type & second) const {
return first.price < second.price;
}
};
struct Customer {
int price;
};
int main(){
Customer c1{3};// last parameter is price
Customer c2{2};
priority_queue<Customer , vector<Customer> , mycomp<Customer> > barQ;
barQ.push(c2);
barQ.push(c1);
cout<<barQ.top().price;
return 0;
}
set::less<>
没有给出Customer*
指针的错误,因为指针比较可能发生在int
,并且它不会查找自定义实现。 Customer
不是这种情况。
答案 1 :(得分:0)
std::less::operator()
的签名(取自cppreference):
bool operator()( const T& lhs, const T& rhs ) const; // (until C++14) constexpr bool operator()( const T& lhs, const T& rhs ) const; //(since C++14)
请注意,它将两个参数都设为const
,因此它只能调用const
operator<
:
bool Customer::operator<(const Customer &other) const { // <--- add const here
return this->price < other.price;
}
你的第二个代码并没有真正做你想做的事情,因为它使用内置的operator<
作为指针。