第一
我有一个包含绘图功能的类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类中所有节点而不必命名它们的替代方法?只是一个简单的清单?
答案 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
循环)之间存在重大差异。
while()
没有任何it++
用于增加迭代器while()
中,您只需拨打setX()
- &GT;什么是存储中的所有节点的替代方式 NodeManager类,而不必命名它们?
可能你正在寻找,
std::vector
(或等效物),如果您只想要一个数组std::set
,如果您希望能够根据Node*
找到节点