是否可以在迭代器的帮助下,通过QMap顺序执行,并执行此类操作:删除一些项目并添加新项目?
例如:
for( QMap<key_t,val_t>::iterator it = map.begin();
it != map.end();
++it )
{
if( it->value == something )
{
map.erase(it);
map.insert(it->key+10,it->value);
}
}
Run Code Online (Sandbox Code Playgroud)
似乎没有什么会做错的,我要求确定.(我没有足够的时间来检查它).
UPD将解决QMap::unite()
:
for( QMap<key_t,val_t>::iterator it = map.begin();
it != map.end();
++it )
{
if( it->value == something )
{
tmp_map.insert(it->key+10,it->value);
map.erase(it);
}
}
map.unite(tmp_map);
Run Code Online (Sandbox Code Playgroud)
谢谢你的回答!
Mik*_*our 14
迭代器将被无效erase
,因此无法安全地使用或之后增加.以下应该有效:
for( QMap<key_t,val_t>::iterator it = map.begin(); it != map.end(); )
{
if( it->value == something )
{
map.insert(it.key()+10,it.value());
it = map.erase(it);
} else {
++it;
}
}
Run Code Online (Sandbox Code Playgroud)
想一想......您正在迭代一个集合,删除中间的一个项目并在其他地方添加另一个项目。迭代器仍然正确吗?“下一个”迭代器真的会是下一个项目吗?
一般来说,更改正在迭代的集合并不是一个好主意。如果您需要,则使用临时集合并将选定的项目复制到该临时集合,然后清除实际集合并将项目从临时集合移动到实际集合。
但就您而言,为什么不使用QMap::find
来搜索something
,如果找到,则将其删除并添加新项目,然后循环执行,直到something
不再找到为止?