在迭代器的帮助下,是否可以通过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);
感谢您的回答!
答案 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;你的迭代器是erase
和insert
返回的迭代器。原则上它很好。