2013-02-27 38 views
7

std::find के साथ इसे खोजने के बाद मुझे std::list से तत्व निकालने की आवश्यकता है। सूची के end() के साथ std::list::erase पर कॉल करने का व्यवहार क्या है?`std :: list` के 'end()` को मिटाने का व्यवहार क्या है?

std::list<T> mylist; 
T value; 
std::list::iterator it = std::find(mylist.begin(), mylist.end(), value); 
std::list::iterator next = mylist.erase(it); 

cplusplus.com का कहना है::

स्थिति (या रेंज) वैध है, तो समारोह कभी नहीं फेंकता अपवाद (कोई-थ्रो गारंटी) मेरी मामला कुछ इस तरह है। अन्यथा, यह अपरिभाषित व्यवहार का कारण बनता है।

लेकिन मुझे नहीं पता कि end() मान्य है या नहीं।

+0

'अंत()' अंतिम तत्व से एक है। –

+0

cplusplus.com भी सम्मानित स्रोतों की सीमाओं के बाहर है। इसके बजाय cppreference.com देखें। – Potatoswatter

+0

@ पोटाटोस्वाटर: इंटरनेट सम्मानित स्रोतों की सीमा से बाहर है। इसके बजाय भाषा विनिर्देश देखें। –

उत्तर

17

वह साइट अस्पष्ट (और तर्कसंगत रूप से गलत) शब्द "वैध" का उपयोग करती है, लेकिन लाइब्रेरी विनिर्देश (सी ++ 11 23.2.3) अधिक विशिष्ट शब्द "dereferenceable" का उपयोग करता है - जिसका अर्थ है कि इटेटरेटर किसी ऑब्जेक्ट को संदर्भित करना चाहिए। अतीत-द-एंड इटेटरेटर अपरिवर्तनीय नहीं है, इसलिए इसे मिटा देना अनिर्धारित व्यवहार देता है।

+3

+1, मुझे लगता है कि वेब * अस्पष्ट * होने की तुलना में एक बुरा मुद्दा है, क्योंकि 'वैध' एक शब्द है जिसका उपयोग मानक और 'अंत()' उपज में किया जाता है * वैध * इटरेटर (यानी वेब पेज * अस्पष्ट नहीं है *, यह ** गलत **) –

+0

असल में, लाइब्रेरी विनिर्देश "मान्य" का भी उपयोग करता है (उदाहरण के लिए सम्मिलन के लिए, जहां 'end() '-इटरेटर है ठीक है), लेकिन यह स्पष्ट रूप से "मान्य * और * dereferencable" कहता है एकल-इटरेटर-मिटा के लिए एक आवश्यकता के रूप में। –

+0

धन्यवाद! यह वही है जिसे मैं देख रहा था। मेरे पास विनिर्देश तक पहुंच नहीं है। क्या आपको पता है कि यह सी ++ 03 में समान है या नहीं? – Janoma

6

यह नहीं है। end() को मिटाने का प्रयास अपरिभाषित व्यवहार में परिणाम।

2

अंत() सूची कंटेनर में पिछले-एंड-एंड इटरेटर का जिक्र करते हुए एक पुनरावर्तक देता है, न कि सूची में अंतिम वस्तु।

अंत को हटाने/मिटाकर, आप अपनी सूची की सीमा से बाहर हट रहे हैं। आपका कोड होना चाहिए:

std::list<T> mylist; 
T value; 
std::list::iterator it = std::find(mylist.begin(), mylist.end(), value); 
If(it!=mylist.end()) 
    std::list::iterator next = mylist.erase(it); 

इसके अलावा, अगर खोज() यह अंत इटरेटर वापस आ जाएगी अपनी सूची में एक मूल्य को खोजने के लिए विफल रहता है, यह मूल रूप से कह रहा है (कि मूल्य आप खोज रहे हैं अपनी सूची से बाहर है आप सूची में नहीं)

+0

कंटेनर में कोई अतीत-अंत-अंत तत्व नहीं है। 'अंत() 'एक अतीत-अंत-अंत ** पुनरावर्तक ** देता है। आम तौर पर, एक अतीत-अंत-अंतराल इटरेटर को किसी तत्व का संदर्भ नहीं लेना पड़ता है, हालांकि कई स्थितियों में यह वास्तव में करता है। –

+0

फिक्स्ड, पागल होने की कोई आवश्यकता नहीं –

+0

पागल? मुझे उम्मीद है कि मैं इस तरह से नहीं आया था। –