简体   繁体   中英

How does the comparator function work in Priority Queue C++ STL?

class Student
{
    public:
    string a;
    int age;
    Student(string a,int age)
    {
        this->a=a;
        this->age=age;
    }
};

bool operator<(const Student &a,const Student &b)
{
    return a.age<b.age;
}

int main()
{
    priority_queue<Student> pq;
    Student a("max",1);
    Student b("john",1);
    pq.push(a);
    pq.push(b);
    cout << pq.top().a << " " << pq.top().age << endl;
    pq.pop();
    cout << pq.top().a << " " << pq.top().age << endl;
    pq.pop();
}

The output is- max 1
john 1

On changing the comparator function

bool operator<(const Student &a,const Student &b)
{
    return a.age<=b.age;
}

The output is-> john 1

max 1

Can somebody please explain how does the comparator function change in case of < and <=?

The source code is as bellow(vs2019 test):

// FUNCTION TEMPLATE _Debug_lt_pred
template <class _Pr, class _Ty1, class _Ty2,
    enable_if_t<is_same_v<_Remove_cvref_t<_Ty1>, _Remove_cvref_t<_Ty2>>, int> = 0>
constexpr bool _Debug_lt_pred(_Pr&& _Pred, _Ty1&& _Left, _Ty2&& _Right) noexcept(
    noexcept(_Pred(_Left, _Right)) && noexcept(_Pred(_Right, _Left))) {
    // test if _Pred(_Left, _Right) and _Pred is strict weak ordering, when the arguments are the cv-same-type
    const auto _Result = static_cast<bool>(_Pred(_Left, _Right));
    if (_Result) {
        _STL_VERIFY(!_Pred(_Right, _Left), "invalid comparator");
    }

    return _Result;
}

you can see the ambiguous compare is invalid.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM