簡體   English   中英

通過C ++映射進行迭代的差異

[英]Differences in iterating through a C++ map

第一

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

map<std::string, Node*>

當我使用迭代器繪制地圖中的所有節點時,什么也沒有發生。 (gc是我傳遞給draw函數的圖形上下文)

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);
}

我的問題是為什么一種有效而另一種無效?

第二個問題是,在無需命名節點管理器類的情況下將所有節點存儲的替代方法是什么? 只是一個簡單的清單?

您不是在第一個循環中調用++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()存儲在變量中,以存儲一點點性能(但很少)。

->但這不起作用。

因為第一個版本( while循環)和第二個版本( for循環)之間存在主要差異。

  1. while()沒有任何it++用於增加迭代器
  2. while()您僅調用setX()

->在無需命名節點的情況下將所有節點存儲在NodeManager類中的另一種替代方法是什么?

可能是您在尋找,

  1. std::vector (或等效項),如果只需要一個數組
  2. std::set ,如果您希望能夠基於Node*查找節點

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM