0

我正在为 Graph 类实现一个迭代器

class iterator_node {
    private:
        Graph* gr_;
        Node* curNode_;
    public:
        iterator_node() : gr_(NULL),curNode_(NULL) {}
        iterator_node(Graph& ddg) : gr_(&ddg),curNode_(NULL) {}
        ~iterator_node() {}
}

我也有一个Graph我应该实现insert功能的类

class Graph {
private:
//....
map<NodeID,Node*> nodes_;
public:
pair<iterator_node,bool> insert(const NodeID nodeId,const NodeLabel nodeLabel);
}
pair<iterator_node,bool> Graph::insert(const NodeID nodeId,const NodeLabel nodeLabel)
{
    DDG::iterator_node itNode(*this);
    pair<Graph::iterator_node,bool> res(itNode,false);
    Node* node = new Node(nodeId,false,nodeLabel);
    pair<map<NodeID,Node*>::iterator,bool> nodeInsRet  = nodes_.insert(pair<NodeID,Node*> (nodeId,node));
    if (nodeInsRet.second == false) {
        std::cout << "Node with nodeID=" << nodeId << " already exists \n";
        delete node;
    }
    else {
        res.second = true;
       //!!Question!!!!
       //should update curNode_; in res`s iterator (res.first)
       //what is a relevan correct way to do it?
    }

    return res;
}
4

1 回答 1

2

你的迭代器不能迭代,除非它可以从一个元素移动到下一个元素。随着您当前的代码递增,iterator_node您必须在整个代码中搜索Graph当前代码Node,然后找到下一个......这将非常慢。

您需要将每个链接Node到其邻居,或者您iterator_node应该存储 amap<NodeID,Node*>::iterator而不是 aNode*

于 2012-11-12T21:13:35.610 回答