У меня есть структура графика, в которой используются узлы (вершины), которые, в свою очередь, имеют ребра, присоединенные в форме std::pair<Node*, int>
, где узел - это другой конец ребра, а целое число - вес ребра. Я бы хотел, чтобы ребра были отсортированы в std::multiset
на основе индекса подключенного узла и веса ребра.
enum color { white, grey, black };
struct EdgeComparator;
struct Node {
int n;
std::multiset<std::pair<Node *, int>, EdgeComparator> edges;
enum color col;
int d; // distance to source node
explicit Node(int n) : n(n), edges(), col(white), d() {};
};
struct EdgeComparator {
bool operator()(const std::pair<Node *, int> &p1,
const std::pair<Node *, int> &p2) {
if (p1.second == p2.second)
return p1.first->n < p2.first->n;
return p1.second < p2.second;
}
};
При таком подходе прямого объявления возникает ошибка: invalid use of incomplete type struct EdgeComparator
. Если я попытаюсь переключить их и объявить узел Node вместо EdgeComparator, поле n
больше не будет отображаться для EdgeComparator, поэтому я столкнулся с замкнутым кругом.
Единственный обходной путь, о котором я подумал, - это использовать std::vector
вместо std::multiset
, а затем применить std::sort
, но это будет довольно дорого с точки зрения эффективности, поэтому мне было интересно, есть ли другой способ.