2012-01-23 12 views
6

o Yineleyicilerin yardımıyla QMap aracılığıyla sequently yürümek doğru mümkün mü ve bu tür eylemler yapıyor: bazı öğeleri kaldırarak ve yenilerini ekleyerek? Örneğino öğeleri ekleyerek yineleyiciler ve silme/ile QMap yürümeye doğru mu?

:

görünüyor
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); 
    } 
} 

, hiçbir şeyin yanlış yapılacaktır, emin olmak için soruyorum. (Bunu kontrol etmek için yeterli zamanım yok).

UPDQMap::unite() ile çözmek Will: cevaplar için

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

Teşekkür!

cevap

4

bir süre ... Sen, bir koleksiyonu üzerinde yineleme ortada bir öğeyi kaldırma ve başka bir yerde başka bir öğe ekliyoruz bunu düşün. Yineleyiciler hala doğru mu olacak? "Sonraki" yineleyici gerçekten bir sonraki öğe olacak mı? Genelde

Eğer yineleme olan bir koleksiyon değiştirmek iyi bir fikir değildir. Daha sonra, geçici bir koleksiyon kullanmanız ve seçilen öğeleri bunun üzerine kopyalamanız gerekiyorsa ve gerçek koleksiyonu temizleyip, materyalleri geçici koleksiyondan gerçek olana taşıyın. Senin durumunda da, neden olmasın something aramak için QMap::find kullanmak ise

ve silme bulursa o ve yeni bir öğe eklemek ve bu something kadar bir döngü içinde yapmak artık bulunmaz?

+0

Yararlı yanıtlar için teşekkür ederiz! Ben QMap kalemi değeri isteyen ile manipüle gerekir çünkü son cümlede senin tavsiye kullanamazsınız. Silme ve ekleme değeri değiştikten sonra, aynı öğelerle sonsuz olarak çalışabilirim. Geçici bir koleksiyon kullanma tavsiyenizi ve QMap :: unite() ile sorunu çözdüm. Çok sağol! – ASten

1

Sen erase ve insert tarafından döndürülen sitelerinden birine yineleyici 'reset' gerekiyor. Prensipte olsa da iyidir.

2

ben it bu durumda it->value ve ++it çalışmaz, map.erase(it) sonra geçersiz olduğu beklenebilir.

13

Yineleyici, erase tarafından geçersiz kılınacak ve bu nedenle daha sonra güvenle kullanılamaz veya artırılamaz. Aşağıdakiler çalışmalıdır:

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

Bunun doğru cevap olduğunu hissediyorum. –

İlgili konular