为用户定义的类

时间:2017-11-12 14:20:15

标签: c++ pointers priority-queue

我有一个名为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;

我没有错误,效果很好。 所以我的问题是客户与客户之间的区别是什么?顾客*? 当我向客户声明它时,我认为它应该工作,而不是客户*,为什么它会起作用呢?

2 个答案:

答案 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<作为指针。