2013-07-05 10 views
5

का उपयोग कर क्यूटी डेटा संरचनाओं को संशोधित करने का उचित तरीका के माध्यम से foreach लूप का उपयोग कर रहा हूं, लेकिन यदि वे किसी निश्चित स्थिति से मेल खाते हैं तो मुझे आइटम हटाने की आवश्यकता है। लूप को गड़बड़ किए बिना ऐसा करने का उचित तरीका क्या है?फ़ोरैच लूप

foreach(Object obj, myLinkedList) 
{ 
    if(obj.val == BAD_VAL) 
     // remove the item from myLinkedList 
} 

मैं पाया है other questions पता इस बात का है कि तरह है, लेकिन ऐसे लिंक्ड सूची के रूप में सामान्य स्थिति के लिए नहीं।

यदि संभव हो तो मैं अन्य डेटा संरचनाओं (जैसे QSet, QHash, आदि) से संबंधित जानना चाहूंगा। धन्यवाद

+0

@hyde मैंने अपने प्रश्न में उस सवाल से जुड़ा हुआ है, जिसमें कहा गया है कि यह जो भी मैं पूछ रहा था उसकी पूरी तरह से संबोधित नहीं किया। 'QList' और 'QLinkedList' के बीच एक अंतर है। वे समान हैं, लेकिन * समान * समान नहीं हैं। –

+0

ठीक है, यह सवाल का जवाब देता है, जहां तक ​​मैं देख सकता हूं। जब आप अपने 'foreach' का उपयोग करते हैं तो क्यूटी कंटेनर की उथली प्रतिलिपि लेता है। यदि आप मूल कंटेनर संरचना को संशोधित करते हैं, तो क्यूटी को पूर्ण कंटेनर की एक नई गहरी प्रतिलिपि (लिखने के अर्थशास्त्र पर प्रतिलिपि बनाने) की आवश्यकता होती है। संक्षेप में, इसके लिए 'foreach' का उपयोग न करें। और अर्थशास्त्र प्रत्येक क्यूटी कंटेनर के लिए समान हैं। – hyde

उत्तर

14

विशेष मामले के लिए:

जाहिर foreach छोरों पर सभी सूची को संशोधित करने के लिए नहीं किया जाना चाहिए, क्योंकि foreach पाश वास्तव में एक पर काम कर रहा है मूल सूची के कॉपी। यदि आप इसे संशोधित करते हैं, न केवल आप अंतर्निहित साझाकरण और संशोधित-लिखने के कारण जुर्माना लगाते हैं, लेकिन लूप से बाहर निकलने के बाद भी आपके परिवर्तनों को त्याग दिया जाता है।

इसे पूरा करने का सही तरीका एक पुनरावर्तक का उपयोग करना है। मैं जावा-स्टाइल इटरेटर्स पसंद करता हूं। आप देखेंगे कि प्रत्येक सूची प्रकार के लिए इटरेटर कक्षाएं हैं जो सरल इटरेटर प्रदान करती हैं। QLinkedList उदाहरण के लिए, कक्षा QMutableLinkedListIterator है।

मेरी टिप्पणी के साथ Qt documentation से कहा::

QMutableLinkedListIterator<int> i(list); // pass list as argument 
while (i.hasNext()) { 
    int val = i.next();     // retrieve value of current item 
    if (val < 0) { 
     i.setValue(-val);    // change/set value of current item 
    } else if (val == 0) { 
     i.remove();      // delete current item 
    } 
} 


सामान्य स्थिति के लिए: यह इस प्रकार के रूप में इस्तेमाल किया जा सकता

आप एक क्यूटी डेटा संरचना अन्य की तुलना में उपयोग कर रहे हैं QLinkedList, संभावनाएं अच्छी हैं कि आपके लिए एक इटरेटर वर्ग है। यदि आप सूची को संशोधित करना चाहते हैं, तो म्यूटेबल संस्करण का उपयोग करें। इनमें से प्रत्येक के लिए एपीआई लगभग समान है।

Structure | Immutable Case  | Mutable Case 
----------------------------------------------------- 
QList  | QListIterator  | QMutableListIterator 
QLinkedList | QLinkedListIterator | QMutableLinkedListIterator 
QHash  | QHashIterator  | QMutableHashIterator 
QMap   | QMapIterator   | QMutableMapIterator 
QSet   | QSetIterator   | QMutableSetIterator 
QStringList | QStringListIterator | QMutableStringListIterator 
QVector  | QVectorIterator  | QMutableVectorIterator 
0

मैं भी यह करने के लिए एक महंगी लेकिन आसान तरीका सुझाव है कि कर सकते हैं: यहाँ वर्ग हैं। एक और सूची बनाएं और अच्छी ऑब्जेक्ट्स कॉपी करें। फिर पुरानी सूची को नए से बदलें।

QLinkedList<Object> new_list; 
foreach(Object obj, myLinkedList) { 
    if(obj.val != BAD_VAL) { 
    new_list << obj; 
    } 
} 
list = new_list; 

यदि आपकी सूची सामग्री बड़ी है तो ऐसा न करें।

संबंधित मुद्दे