Создание минимальной кучи из очереди приоритетов STL

Я создаю кучу мин из очереди приоритетов 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

Решение

Третий параметр шаблона должен быть двоичным функтором, принимающим teo Plane*, Ваш Plane класс не обеспечивает этого.

Вам нужно что-то в форме

struct CompPlanePtrs
{
bool operator()(const Plane* lhs, const Plane* rhs) const {
return lhs->fuel > rhs->fuel ;
}
};
7

Другие решения

Если вы откажетесь от использования указателей (которые излишни для ваших простых структур), то вы можете использовать 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;
}
12

По вопросам рекламы [email protected]