为用户定义的 class 声明 priority_queue
Declaring priority_queue for user-defined class
我有一个名为 Customer 的 class,它正在重载 < 运算符:
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;
我没有发现任何错误,而且运行良好。
所以我的问题是 Customer 和 Customer* 之间有什么区别?
我认为当我用 Customer 而不是 Customer* 声明它时它应该起作用,为什么它不能起作用?
您在 operator
过载
中缺少 const
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
.
不是这种情况
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<
作为指针。
我有一个名为 Customer 的 class,它正在重载 < 运算符:
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;
我没有发现任何错误,而且运行良好。 所以我的问题是 Customer 和 Customer* 之间有什么区别? 我认为当我用 Customer 而不是 Customer* 声明它时它应该起作用,为什么它不能起作用?
您在 operator
过载
const
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
.
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<
作为指针。