使用迭代器和擦除/添加项目来遍历QMap是否正确?

ASt*_*ten 6 c++ qt iterator

是否可以在迭代器的帮助下,通过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)


Som*_*ude 4

想一想......您正在迭代一个集合,删除中间的一个项目并在其他地方添加另一个项目。迭代器仍然正确吗?“下一个”迭代器真的会是下一个项目吗?

一般来说,更改正在迭代的集合并不是一个好主意。如果您需要,则使用临时集合并将选定的项目复制到该临时集合,然后清除实际集合并将项目从临时集合移动到实际集合。

但就您而言,为什么不使用QMap::find来搜索something,如果找到,则将其删除并添加新项目,然后循环执行,直到something不再找到为止?