4

我正在从 stl 优先级队列创建一个最小堆。这是我正在使用的课程。

class Plane
{
  private :
    int id ;
    int fuel ;
 public:
    Plane():id(0), fuel(0){}
    Plane(const int _id, const int _fuel):id(_id), fuel(_fuel) {}

    bool operator > (const Plane &obj)
    {
        return ( this->fuel > obj.fuel ? true : false ) ;
    }

} ;

我主要是这样实例化一个对象。

 priority_queue<Plane*, vector<Plane*>, Plane> pq1 ;
 pq1.push(new Plane(0, 0)) ;

我收到一个xutility我无法理解的错误。

d:\microsoft visual studio 10.0\vc\include\xutility(674): 错误 C2064: 术语不计算为采用 2 个参数的函数

对其解决方案的任何帮助将不胜感激。

4

2 回答 2

12

如果您放弃使用指针(这对于您的简单结构来说太过分了),那么您可以std::greater从标题中使用functional

std::priority_queue<Plane, std::vector<Plane>, std::greater<Plane> > pq1;
pq1.push(Plane(0, 0));

目前,您正在Plane作为比较类型进行喂养。这是行不通的,因为比较类型必须是一种函数对象,即它必须有一个operator()进行比较的对象。Plane没有这样的成员(仅仅为此目的添加它是个坏主意)。

std::greater有适当的方法,根据您的operator>. 但是,它不适用于指针,因为它使用指针比较(基于内存地址)。

顺便说一句,请注意,您的比较函数可以更简洁地表示为

bool operator>(const Plane &other)
{
    return fuel > other.fuel;
}
于 2012-12-07T15:08:31.313 回答
7

第三个模板参数必须是采用 teo 的二元仿函数Plane*。你的Plane班级没有提供。

你需要某种形式的东西

struct CompPlanePtrs
{
  bool operator()(const Plane* lhs, const Plane* rhs) const {
    return lhs->fuel > rhs->fuel ;
  }
};
于 2012-12-07T15:03:34.897 回答