为std :: set实现自定义比较类(使用std :: shared_ptrs),比较有向加权图

时间:2016-09-18 01:25:24

标签: c++ shared-ptr comparator directed-graph stdset

我试图从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实际上可以找到所需的实际边缘对象?

0 个答案:

没有答案