2012-03-05 103 views
0

第一個迭代通過C++映射的差異

我有一個包含繪圖函數的類節點。節點包含在地圖中,例如:

map<std::string, Node*> 

當我使用迭代器繪製地圖中的所有節點時,什麼都不會發生。 (gc是我傳遞給繪圖函數的圖形上下文)

std::map<std::string, Node*>::const_iterator itr = _Nodes.begin(); 
while(itr != _Nodes.end()) 
{ 
    itr->second->setX(100); 
} 

但是這不起作用。但是,如果我構建我的迭代器不同,它的作品。

std::map<std::string, Node*>::const_iterator end = _Nodes.end(); 
for(std::map<std::string, Node*>::const_iterator it = _Nodes.begin(); it != end; ++it){ 
    it->second->draw(gc); 
    it->second->setSize(100); 
} 

我的問題是爲什麼一個人工作,而不是其他人?

第二個問題是,如何在NodeManager類中存儲所有節點而不必命名它們的替代方法是什麼?只是一個簡單的列表?

+3

在第一個'while'循環中,您不會調用'draw'。這是一個錯字還是一個真正的錯誤? – Naveen 2012-03-05 04:59:32

+2

請勿使用下劃線 - 大寫名稱,因爲它們是保留的,並且使用它們是未定義的行爲。 – 2012-03-05 05:48:16

回答

5

您在第一次循環中不打電話給++itr。你的迭代器永遠不會改變。

應該是:

std::map<std::string, Node*>::const_iterator itr = _Nodes.begin(); 
while(itr != _Nodes.end()) 
{ 
    itr->second->setX(100); 
    ++itr; 
} 

PS:如果你可以使用C++ 11,這是方便多了:

auto itr = _Nodes.begin(); 

PPS:_Node是被禁止的名字。以下劃線+大寫開頭的名稱由標準保留。

PPPS:在第一個示例中,您可以將end()存儲在變量中以存儲一點性能(但很少)。

4

- >但這並不奏效。

因爲有第1版(while環路)和第二版(for環路)之間的主要區別。

  1. while()沒有任何it++增加迭代
  2. while()只調用setX()

- >什麼會的是所有存儲在節點的另一種方法 NodeManager類,而不必命名它們?

可能是你正在尋找,

  1. std::vector(或等價物),如果你想只是一個數組
  2. std::set,如果你希望能夠找到一個節點基於Node*
+0

99%的機會他想要'vector' /'set',但不要忘記'deque'! (請忘記「列表」...) – 2012-03-05 06:46:08