Я создаю кучу мин из очереди приоритетов 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 аргумента
Любая помощь в ее решении будет принята с благодарностью.
Третий параметр шаблона должен быть двоичным функтором, принимающим teo Plane*
, Ваш Plane
класс не обеспечивает этого.
Вам нужно что-то в форме
struct CompPlanePtrs
{
bool operator()(const Plane* lhs, const Plane* rhs) const {
return lhs->fuel > rhs->fuel ;
}
};
Если вы откажетесь от использования указателей (которые излишни для ваших простых структур), то вы можете использовать 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;
}