Очередь приоритетов пользовательского класса с использованием Comparator с аргументом в конструкторе в переполнении стека

Я хочу создать 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,

Как мне поступить?

Большое спасибо!

1

Решение

Параметр шаблона является тип компаратора. Вам все еще нужно пройти пример компаратора для конструктора 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)));
1

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

перегрузка operator==, operator!=, operator> а также operator< в Edge класс, так что вы можете просто сравнить их e1 == e2 в вашем компараторе.

Также не производные от std::map, Не имеет virtual деструктор, который делает плохую идею, чтобы извлечь из него.

Просто имейте свою карту в качестве личного члена вашего класса.

2

В соответствии с эта ссылка здесь, существует перегрузка, которая позволяет вам передать свой предикат в priority_queueконструктор.

2