我试图从edges_中删除一个边缘,它使用std::shared_ptr<Edge>
作为std :: set存储在Graph类Node结构中:
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_
找到边缘才能使用std::set
的erase()方法在上面。但是,变量findEdge等于edges_.end()
,因为基于我的if-else检查在集合中找不到给定边缘(&#34;在边缘找不到边缘_ !!&#34;已打印) 。要查找元素,std::set
使用Compare对象,其类型是通过我没有指定的第二个模板参数定义的,因此它默认为std::less<std::shared_ptr<Edge>>
,后者又调用共享指针的operator<
,它不比较对象而只比较指针。因此,如果用于插入和搜索的指针没有指向完全相同的(就像在相同的,而不仅仅是#34;相等的#34;)对象,它实际上并没有成功找到边缘。
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) ));
如何为我的set edges_实现自定义比较类,比较实际的Edge对象,因此findEdge实际上可以找到所需的实际边缘对象?