0

グラフクラスのイテレータを実装しています

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の全体を検索してから次のコードを見つける必要があります...これは非常に遅くなります。GraphNode

Nodeそれぞれを隣接するものにリンクする必要があるか、または a の代わりに aiterator_nodeを保存する必要がありますmap<NodeID,Node*>::iteratorNode*

于 2012-11-12T21:13:35.610 に答える