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

时间:2012-01-23 14:19:41

标签: 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); 
     } 
}

看来,没有什么会做错的,我要求确定。 (我没有足够的时间来检查它。)

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);

感谢您的回答!

4 个答案:

答案 0 :(得分: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;
    }
}

答案 1 :(得分:4)

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

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

但是,在您的情况下,为什么不使用QMap::find来搜索something,如果找到则删除它并添加新项目,并在循环中执行{{1}找不到了?

答案 2 :(得分:2)

我希望在it之后map.erase(it)无效,在这种情况下,it->value++it将无效。

答案 3 :(得分:1)

你必须重置&#39;你的迭代器是eraseinsert返回的迭代器。原则上它很好。