为用户定义的 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< 作为指针。