C ++ STL priority_queue,比较对象的方式

时间:2014-10-05 10:58:06

标签: c++ stl priority-queue

我不知道如何实现priority_queue,在比较对象整数字段时,它是清楚的。 例如

bool operator()(const Toast &t1, const Toast &t2) const
{
    int t1value = t1.bread * 1000 + t1.butter;
    int t2value = t2.bread * 1000 + t2.butter;
    return t1value < t2value;
}

这将根据值将对象放在堆中。 问题是如何根据bool字段比较对象?如何根据布尔类型存储多个对象? 例如 : vip = true ,notvip = false ; Vip1,notVip2,Vip3。
结果应该是:Vip1,Vip3,notVip2; 你能给我一个想法吗?

1 个答案:

答案 0 :(得分:0)

你的问题有点不清楚。我将假设您要排序的结构是Toast

如果您只是想根据Toast bool来确定status的优先级,请说明class mycomparison { public: bool operator() (const Toast& lhs, const Toast& rhs) const { return lhs.status < rhs.status; } }; ,您的比较对象非常简单:

Toast

现在,我将假设以下内容对此进行了扩展,因为bool已将以下vip成员按最重要到最不重要的顺序列出:notvip,{{ 1}},Vip1 , Vip3 , and notVip2`,我还假设“非”成员的比较应该倒置:

class mycomparison
{
public:
    bool operator() (const Toast& lhs, const Toast& rhs) const
    {
        return lhs.vip < rhs.vip || lhs.vip == rhs.vip && // return true if rhs.vip is the only true or continue to test
             ( lhs.noVip > rhs.noVip || lhs.noVip == rhs.noVip && // return true if rhs.noVip is the only false or continue to test
             ( lhs.Vip1 < rhs.Vip1 || lhs.Vip1 == rhs.Vip1 && // return true if lhs.Vip1 is less than rhs.Vip1 or continue to test
             ( lhs.Vip3 < rhs.Vip3 || lhs.Vip3 == rhs.Vip3 && // return true if lhs.Vip3 is less than rhs.Vip3 or continue to test
               lhs.notVip2 > rhs.notVip2 ) ) ); // return true if lhs.notVip2 is greater than rhs.notVip2 or return false
    }
};

请注意,如果成员为mycomparisonbooloperator<operator>operator==的任何其他类型,则这些mycomparision类中的任何一个都可以正常工作定义。要在std::priority_queue中使用std::priority_queue,您只需将其作为std::priority_queue< Toast > foo( mycomparison() );的ctor中的比较对象传递,例如:{{1}}