2012-01-23 41 views
6

在迭代器的幫助下,是否可以通過QMap逐步走動,並執行下列操作:刪除一些項目並添加新項目?用迭代器和刪除/添加項目遍歷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

想一想......有一段時間...您正在迭代集合,刪除中間的項目,並在其他地方添加另一個項目。迭代器是否仍然正確?下一個迭代器是否會成爲下一個項目?

通常,更改正在迭代的集合並不是一個好主意。如果您需要使用臨時收藏並將選定項目複製到該收藏,並清除真實收藏並將項目從臨時收藏移至真實收藏。

在你的情況雖然,爲什麼不使用QMap::find搜索something,如果發現刪除它並添加新的項目,做一個循環,直到something不再被發現的?

+0

謝謝你的有用答案!我不能在最後一句中使用你的建議,因爲我應該用QMap的項目來操作它的值。擦除和插入後值不會改變,所以我可以無限地使用相同的項目。我已經考慮到你的建議,使用臨時集合並用QMap :: unite()解決問題。非常感謝! – ASten

1

您必須將您的迭代器重置爲由eraseinsert返回的迭代器。原則上這很好。

2

我希望itmap.erase(it)之後無效,在這種情況下it->value++it將不起作用。

13

該迭代器將被失效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; 
    } 
} 
+0

我覺得這是正確的答案。 –