Реализуйте пользовательский класс сравнения для std :: set (используя std :: shared_ptrs), который сравнивает граничные объекты ориентированного взвешенного графа

Я пытаюсь удалить ребро изdge_, которое хранится в структуре Node класса Graph как std :: set, используя std::shared_ptr<Edge>:

template <typename N, typename E> class Graph {

private:
struct Node;
struct Edge;

struct Node {
N val_;
int numEdges_;
int numIncomingEdges_;
std::set<std::shared_ptr<Edge>> edges_;
std::set<std::shared_ptr<Edge>> incomingEdges_;
Node() {}
Node(const N x) : val_{x} { numEdges_=0; }
void printNode(N n);
~Node();
void update();
};

struct Edge {
std::weak_ptr<Node> orig;
std::weak_ptr<Node> dest;
E val_;
Edge(std::shared_ptr<Node> o, std::shared_ptr<Node> d, E x);
Edge() {};
void printEdge();
~Edge();
};

В следующем коде я пытаюсь удалить ребро из edges_, но сначала мне нужно найти преимущество от edges_ прежде чем я смогу использовать метод erase () для std::set в теме. Однако переменная findEdge равна edges_.end(), поскольку данное ребро не было найдено в наборе на основе моей проверки if-else (было напечатано «невозможно найти ребро в ребрах_ !!»). Чтобы найти элемент, std::set использует объект Compare, тип которого определяется с помощью второго параметра шаблона, который я не указал, поэтому по умолчанию std::less<std::shared_ptr<Edge>> который в свою очередь называет operator< общего указателя, который не сравнивает объекты, а только указатели. Следовательно, если указатели, используемые для вставки и поиска, не указывают точно на один и тот же (как и в идентичном, а не только «равный») объект, он фактически не находит ребро успешно.

            auto findEdge = findLinkingNode1->second->edges_.find(edge);
// if can find edge in edges_
if (findEdge != findLinkingNode1->second->edges_.end()) {
std::cout << "can find edge in edges_ so erasing it!" << std::endl;
findLinkingNode1->second->edges_.erase(findEdge);
} else {
std::cout << "cannot find edge in edges_!!" << std::endl;
}

Как край был вставлен в edge_, выглядит следующим образом, где край был превращен в shared_ptr<Edge> положить в std::set:

findOrig->second->edges_.insert(std::make_shared<Edge>(Edge (findOrig->second, findDest->second, val) ));

Как реализовать пользовательский класс сравнения для моего набораdge_, который сравнивает фактические объекты Edge, чтобы findEdge мог действительно найти нужный объект края?

0

Решение

Задача ещё не решена.

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

Других решений пока нет …

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