2009-04-17 7 views
11

मैं सी ++ में चीजों की एक सूची को लागू करने की योजना बना रहा हूं जहां तत्वों को आदेश से हटा दिया जा सकता है। मुझे उम्मीद नहीं है कि मुझे किसी भी प्रकार की यादृच्छिक पहुंच की आवश्यकता होगी (मुझे समय-समय पर सूची को साफ़ करने की आवश्यकता है), और वस्तुओं का क्रम महत्वपूर्ण नहीं है।सी ++ इटरेटर्स की आजीवन और वैधता क्या है?

तो मैंने सोचा कि std::list<Thing*> with this->position = insert(lst.end(), thing) चाल चलाना चाहिए। मैं थिंग क्लास को प्रत्येक इंस्टेंस की स्थिति याद रखना चाहता हूं ताकि मैं बाद में आसानी से lst.erase(this->position) कर सकूं।

हालांकि, मैं अभी भी सी ++ एसटीएल कंटेनरों के लिए थोड़ा नया हूं, और मुझे नहीं पता कि यह इतने लंबे समय तक इटरेटर को सुरक्षित रखना सुरक्षित है या नहीं। विशेष रूप से, यह देखते हुए कि आगे बढ़ने से पहले अन्य तत्वों को हटा दिया जाएगा और डालने के बाद।

उत्तर

13

सूची में सभी पुनरावर्तक डालने के दौरान मान्य रहते हैं और मिटाने के दौरान तत्वों को मिटाने के लिए केवल इटरेटर अमान्य हो जाते हैं।

आपके मामले में इटरेटर को ठीक रखना चाहिए, भले ही अन्य तत्व आगे हटाए जाएं और सम्मिलित थिंग * के बाद।

संपादित:

वेक्टर: वेक्टर और Deque के लिए

अतिरिक्त विवरण

  • डालने --- सभी iterators अमान्य मिल पुनः आबंटन होता है अगर, अन्यथा अपने वैध ।
  • मिटा रहा है ---- मिटाए जाने के बाद सभी इटरेटर अमान्य हो जाते हैं।

Deque:

  • डालने --- सभी iterators अमान्य मिलता है।
  • मिटाने ---- सभी इटरेटर अमान्य हो जाते हैं।
+0

अच्छा जवाब, यह जानने में भी मदद करेगा कि वेक्टर को पुन: आवंटित करने के कारण क्या हो सकते हैं। (तत्व को सम्मिलित करना स्पष्ट है, लेकिन क्या अन्य हैं?) – Malabarba

+0

वेक्टर (दोनों डालने और निकालने) के किसी भी संशोधन को पुन: आवंटित करने और इसे निष्क्रिय करने की अनुमति है; चाहे कोई ऐसा करता है या नहीं, कार्यान्वयन-परिभाषित है। तो आप यह मानने से सबसे अच्छे हैं कि वेक्टर को किसी भी तरह से संशोधित करने से सभी मौजूदा इटरेटर्स हमेशा अमान्य हो जाते हैं। – Miral

3

यह आपके द्वारा उपयोग किए जाने वाले कंटेनर पर निर्भर करता है।

चेक: http://www.sgi.com/tech/stl/
अंत में प्रत्येक कंटेनर दस्तावेज़ों को देखें, उनकी इच्छाएं उन शर्तों पर एक विवरण होंगी जिनके तहत इटरेटर वैध रहते हैं।

std :: सूची <> वे सभी शर्तों के तहत मान्य रहते हैं जब तक वे वास्तव में संदर्भित तत्व को कंटेनर से हटा नहीं देते हैं (इस बिंदु पर वे अमान्य हैं)।

+0

जानकारी के लिए धन्यवाद। मैं पहले से ही एसजीआई के दस्तावेज का उपयोग कर रहा था, लेकिन मुझे लगता है कि मैंने नोटों को अनदेखा किया और जवाब नहीं दिया कि जवाब वहां था। – PypeBros

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