迭代C ++映射的差异

时间:2012-03-05 04:56:17

标签: c++ map iterator

第一

我有一个包含绘图功能的类Node。节点包含在地图中,例如:

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类中所有节点而不必命名它们的替代方法?只是一个简单的清单?

2 个答案:

答案 0 :(得分: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()存储在变量中以存储一点性能(但很少)。

答案 1 :(得分:4)

  

- &GT;但这不起作用。

因为第一个版本(while循环)和第二个版本(for循环)之间存在重大差异。

  1. while()没有任何it++用于增加迭代器
  2. while()中,您只需拨打setX()
  3.   

    - &GT;什么是存储中的所有节点的替代方式   NodeManager类,而不必命名它们?

    可能你正在寻找,

    1. std::vector(或等效物),如果您只想要一个数组
    2. std::set,如果您希望能够根据Node*找到节点