Я пытаюсь удалить ребро из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 мог действительно найти нужный объект края?
Задача ещё не решена.
Других решений пока нет …