2012-01-23 7 views
6

क्या इटरेटर की मदद से क्यूमैप के माध्यम से अनुक्रमिक रूप से चलना संभव है, और ऐसे कार्यवाही कर रहे हैं: कुछ वस्तुओं को हटाकर और नए जोड़ना?क्या यह इटरेटर्स के साथ क्यूएपी के माध्यम से चलना और वस्तुओं को मिटाना/जोड़ना सही है?

उदाहरण के लिए:

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

ऐसा लगता है, कि कुछ भी नहीं गलत किया जाएगा, मुझे यकीन है कि होने के लिए पूछ रहा हूँ। (मेरे पास इसे जांचने के लिए पर्याप्त समय नहीं है)।

युपीडी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

इसके बारे में थोड़ी देर के बारे में सोचें ... आप एक संग्रह पर फिर से चल रहे हैं, बीच में एक आइटम को हटा रहे हैं और कहीं और एक और आइटम जोड़ रहे हैं। क्या इटेटर अभी भी सही होंगे? क्या "अगला" इटेटरेटर वास्तव में अगला आइटम होगा?

सामान्य रूप से एक संग्रह को बदलने के लिए एक अच्छा विचार नहीं है जिसे आप पुन: चालू कर रहे हैं। यदि आपको अस्थायी संग्रह का उपयोग करने और उस पर चयनित वस्तुओं की प्रतिलिपि बनाने की आवश्यकता है, और वास्तविक संग्रह को साफ़ करें और आइटम को अस्थायी संग्रह से वास्तविक पर ले जाएं।

अपने मामले हालांकि, क्यों something के लिए खोज करने के लिए QMap::find का उपयोग नहीं है, और यदि मिटा पाया यह और नया आइटम जोड़ने, और यह something जब तक एक पाश में क्या अब और नहीं पाया जाता है?

+0

उपयोगी उत्तर के लिए धन्यवाद! मैं अंतिम वाक्य में आपकी सलाह का उपयोग नहीं कर सकता क्योंकि मुझे अपने मूल्य की तलाश में क्यूमैप की वस्तु के साथ छेड़छाड़ करनी चाहिए। मिटाने और मूल्य डालने के बाद नहीं बदलता है, इसलिए मैं असीमित वस्तुओं के साथ काम कर सकता हूं। मैंने एक अस्थायी संग्रह का उपयोग करने और QMap :: unite() के साथ समस्या को हल करने के लिए आपकी सलाह को ध्यान में रखा है। बहुत धन्यवाद! – ASten

1

आपको अपने पुनरावर्तक को erase और insert द्वारा लौटाए गए एक को रीसेट करना होगा। हालांकि सिद्धांत में यह ठीक है।

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

मुझे लगता है कि यह सही जवाब है। –