Я хочу создать priority_queue
класса Edge
в C ++.
Для этого я создал edgeCompare
Класс компаратора выглядит следующим образом:
class edgeCompare{
public:
map<int, glm::mat4x4> * Qmap;
edgeCompare(const map<int, glm::mat4x4> & Qm){
* Qmap = Qm;
}
bool operator() (const Edge & e1, const Edge & e2) const{
// code that compares and returns corresponding bool
// OBS: in this function I use *Qmap
}
}
Дело в том, что, как вы видите, мне нужна внешняя переменная для сравнения.
priority_queue
обычно объявляется как:
priority_queue<Edge, vector<Edge>, edgeCompare> pq;
Но в моем случае мне нужно построить edgeComparator
с моей переменной Qmap
,
Как мне поступить?
Большое спасибо!
Параметр шаблона является тип компаратора. Вам все еще нужно пройти пример компаратора для конструктора priority_queue, и именно тогда вы можете создать экземпляр компаратора с любыми параметрами, которые вам нравятся.
Например:
map<int, glm::mat4x4> m;
edgeCompare comp(m);
priority_queue<Edge, vector<Edge>, edgeCompare> pq(comp);
Вы также можете создать edgeCompare
объект встроенный, но для устранения неоднозначности необходимы дополнительные скобки:
priority_queue<Edge, vector<Edge>, edgeCompare> pq((edgeCompare(m)));
перегрузка operator==
, operator!=
, operator>
а также operator<
в Edge
класс, так что вы можете просто сравнить их e1 == e2
в вашем компараторе.
Также не производные от std::map
, Не имеет virtual
деструктор, который делает плохую идею, чтобы извлечь из него.
Просто имейте свою карту в качестве личного члена вашего класса.
В соответствии с эта ссылка здесь, существует перегрузка, которая позволяет вам передать свой предикат в priority_queue
конструктор.