迭代C++映射的差异

mob*_*obo 0 c++ iterator map

第一

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

map<std::string, Node*>
Run Code Online (Sandbox Code Playgroud)

当我使用迭代器绘制地图中的所有节点时,没有任何反应.(gc是我传递给绘图函数的图形上下文)

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

但这不起作用.但是,如果我构造我的迭代器不同,它的工作原理.

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);
}
Run Code Online (Sandbox Code Playgroud)

我的问题是为什么一个工作而不是另一个?

第二个问题是什么是存储NodeManager类中的所有节点而不必命名它们的替代方法?只是一个简单的清单?

J.N*_*.N. 5

你没有++itr在第一个循环中调用.你的迭代器永远不会改变.

应该:

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

PS:如果你可以使用C++ 11,这样会更方便:

auto itr = _Nodes.begin();
Run Code Online (Sandbox Code Playgroud)

PPS:_Node是一个禁止的名字.以下划线+大写字母开头的名称由标准保留.

PPPS:在第一个示例中,您可能希望存储end()在变量中以存储一点性能(但很少).