2009-05-05 17 views
22

संभव डुप्लिकेट:
C++ Best way to check if an iterator is validएसटीएल इटरेटर कुछ भी बताता है या नहीं?

मैं इस तरह कुछ करना चाहता हूँ:

std::vector<int>::iterator it; 
// /cut/ search for something in vector and point iterator at it. 
if(!it) //check whether found 
    do_something(); 

लेकिन वहाँ कोई ऑपरेटर है! इटरेटर के लिए। मैं यह कैसे जांच सकता हूं कि इटरेटर कुछ भी इंगित करता है या नहीं?

+0

यह किसी का उपयोग करने के लिए समझ में नहीं आता है कंटेनर के किसी भी संदर्भ के बिना iterator यह पुनरावृत्त है। जेम्स हॉपकिन के जवाब देखें। –

+0

अंधेरे को स्पष्ट करना एसटीएल इटरेटर्स का अमान्यता: http://www.angelikalanger.com/Conferences/Slides/CppInvalidIterators-DevConnections-2002.pdf – lsalamon

उत्तर

46

आप नहीं कर सकते। सामान्य मुहावरे कंटेनर के अंत इटरेटर को 'नहीं मिला' मार्कर के रूप में उपयोग करना है। यह std::find रिटर्न है।

std::vector<int>::iterator i = std::find(v.begin(), v.end(), 13); 
if (i != v.end()) 
{ 
    // ... 
} 

एकमात्र चीज जिसे आप बिना असाइन किए गए इटरेटर के साथ कर सकते हैं वह एक मान निर्दिष्ट करता है।

+1

जब आप इटरेटर प्रारंभ किया जाता है और अभी भी वैध होता है तो आपने मामले को कवर किया है। हालांकि, कुछ कंटेनर पर कुछ ऑपरेशन इटरेटर को अमान्य कर सकते हैं। उदाहरण के लिए, वेक्टर से तत्वों को हटाने से इटरेटर्स को अमान्य कर दिया जा सकता है (इस मामले में वेक्टर में अंतिम तत्व को इंगित करने वाला इटरेटर)। –

+1

@ कैटलिन: यह सब सच है, लेकिन सवाल के दायरे से बाहर, मुझे लगता है। जैसे ही! ('नहीं ') ऑपरेटर केवल वैध या शून्य पॉइंटर्स के साथ काम करेगा, उपरोक्त केवल वैध इटरेटर्स (' एंड' इटरेटर्स सहित) के साथ काम करेगा। –

+0

इटरेटर वैधता प्रोग्रामर के चीजों के बारे में चिंता करने के दायरे में है। आप केवल यही हैं कि यह सुनिश्चित करने की ज़रूरत है कि आप अपने इटरेटर के साथ कुछ बुरा नहीं कर रहे हैं। – Spidey

0

आप एक पाश में इटरेटर का उपयोग करना चाहते हैं, तो सबसे सुरक्षित तरीका यह इस फैशन में है का उपयोग करने के:

for (std::vector<int>::iterator it = v.begin(); it != v.end(); ++it) 
{ 
do_smth(); 
} 
+0

असल में कई मानक एल्गोरिदम इटरेटर्स (जैसे खोज) और कंटेनरों पर विधियों (उदाहरण के लिए नक्शा :: ढूंढें) –

+0

यह सुरक्षित है जब तक कि लूप 'मिटाएं (इसे)' मिटा देता है क्योंकि मिटाए जाने के बाद, 'यह' अमान्य हो जाता है और बाद में '++ यह अमान्य है। –

+0

प्रश्न का उत्तर नहीं देता – lalitm

2

iterators संकेत के सामान्य रूप माना जाता है हालांकि, वे वास्तव में संकेत नहीं हैं। कंटेनर में खोज विफलता को इंगित करने के लिए मानक Past-the-end इटरेटर परिभाषित करता है। इसलिए, NULL

Past-the-end मानों के लिए पुनरावृत्तियों की जांच करने की अनुशंसा नहीं की जाती है। मूल्य गैर-संवेदी और अनौपचारिक हैं।

if(it != aVector.end()) //past-the-end iterator 
    do_something(); 
-3

मेरा मानना ​​है कि यह आम तौर पर करना चाहिए आप एक अच्छे परीक्षण दे:

if (iterator._Mycont == &MyContainer) 
{ 
Probably a valid iterator! 
} 

आप परीक्षण कर सकता है यह सुनिश्चित करें कि इटरेटर नहीं बराबर अंत करता है बनाने के लिए ...

iterator != MyContainer.end() 

और:

iterator >= MyContainer.begin() 
+2

अत्यंत संकलक (और संस्करण!) निर्भर करता है। –

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