c ++中STL的priority_queue

时间:2013-11-20 09:01:58

标签: c++ stl priority-queue

我想构建两个具有不同比较方法的优先级队列(有两个反向优先级方法,名为cmp1和cmp2) 我的程序无法通过编译器检查。为什么会发生这样的错误,是否有更好的解决方案?

#include <iostream>
#include <queue>
#include <string>
using namespace std;

struct item
{
    string name;
    string sex;
    string id;
    double score;
    friend istream& operator >> (istream &is,item& data)
    {
        is>>data.name>>data.sex>>data.id>>data.score;
    }
    /*friend bool operator < (item& a,item& b)
    {
        return a.score<b.score;
    }*/
};

struct cmp1{
    operator bool()(item& x,item& y)
    {
        return x.score>y.score;
    }
};
struct cmp2
{
    operator bool()(item& x,item& y)
    {
        return x.score<y.score;
    }
};
int main()
{
    priority_queue<item,vector<item>,cmp1> boys;
    priority_queue<item,vector<item>,cmp2>girls;
    item temp;
    int num;
    cin>>num>>temp;
    for(int i=0;i<num;i++)
    {
        if(temp.sex=="M")
            boys.push(temp);
        else
            girls.push(temp);
    }

    return 0;
}

5 个答案:

答案 0 :(得分:2)

我会对这个问题大加猜测....你的比较函子是不正确的。您需要重载函数调用运算符,即

,而不是重载operator bool
struct cmp1{
    bool operator()(const item& x, const item& y)
    {
        return x.score>y.score;
    }
};

struct cmp2
{
    bool operator()(const item& x, const item& y)
    {
       return x.score<y.score;
    }
};

(也许这就是你的意图,但只是让语法有点错误?)

答案 1 :(得分:1)

实际上,我认为最好的方法是使用std :: less和std :: greater。如果你有重载运算符&lt;和运算符&gt;对于你的班级,你可以这样做:

std::priority_queue<item, std::vector<item>, std::greater<item>> boys;
std::priority_queue<item, std::vector<item>, std::less<item>> girls;

这样你就不必编写仿函数了。不要忘记#include <functional>

另外,不要忘记运算符必须使用const ref参数重载(你也可以按值获取它们,但这通常不是一个好主意),并且作为const方法,如:

bool operator<(const item& i) const {
    return value < i.value;
}
bool operator>(const item& i) const {
    return value > i.value;
}

答案 2 :(得分:0)

将您的操作员功能更改为:

struct cmp1{
  bool operator()(item& x,item& y)
  {
    return x.score>y.score;
  }
};
struct cmp2
{
  bool operator()(item& x,item& y)
  {
    return x.score<y.score;
  }
};

答案 3 :(得分:0)

您已经在比较类中定义了错误的方法。

请尝试以下代码:

struct cmp1{
    bool operator()(item& x,item& y)
    {
        return x.score>y.score;
    }
};

您已将方法定义为operator bool() ...

同样很高兴将const添加到参数中,如const item& x表示您不会更改它们的值,以及函数定义末尾的const:

bool operator()(const item& x, const item& y) const {...}

表示您也不会更改成员字段。

答案 4 :(得分:0)

我将写下预测的第三个正确版本

struct cmp1
{
    bool operator()( const item &x, const item &y ) const
    {
        return x.score > y.score;
    }
};

struct cmp2
{
    bool operator()( const item &x, const item &y ) const
    {
       return x.score < y.score;
    }
};