2012-11-12 51 views
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; 
} 
+0

嗯,你不介意做你的問題多一點清楚了嗎? – JohnB

回答

2

你的迭代器無法循環除非它可以從一個元素移動到另一個元素。使用當前代碼遞增iterator_node,您必須搜索整個Graph以查找當前的Node,然後找到下一個......這將會非常慢。

要麼你需要將每個Node鏈接到它的鄰居,或者你iterator_node應該存儲map<NodeID,Node*>::iterator代替Node*