2009-08-24 12 views
7

सहयोगी कंटेनर के लिए, क्या ++ ऑपरेटर संग्रह के अंत में एक इटरेटर भेज सकता है?क्या एसटीएल मानचित्र इटरेटर बढ़ने के माध्यम से सीमा से बाहर जा सकता है?

उदाहरण:

map<UINT32, UINT32> new_map; 
new_map[0] = 0; 
new_map[1] = 1; 

map<UINT32, UINT32> new_iter = new_map.begin(); 

++new_iter; 
++new_iter; 
++new_iter; 
++new_iter; 
++new_iter; 
++new_iter; 
++new_iter; 

इस के अंत में, new_iter == new_map.end(), या यह महान अज्ञात में समाप्त करता है?

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

+1

तो क्या आपने इसे संकलित किया है और जांच की है कि क्या यह अंत में new_map.end() होगा? यदि आप निश्चित नहीं हैं तो इस तरह के किसी प्रश्न का उत्तर देने का शायद सबसे आसान तरीका। – Goz

+9

@Goz: नहीं, यह सिर्फ जवाब देगा कि एक कार्यान्वयन क्या कर रहा है। – sbi

+3

संभावित डुप्लिकेट [क्या होता है यदि आप एक एसटीएल कंटेनर के अंत पुनरावर्तक के बराबर एक इटरेटर को बढ़ाते हैं] (https://stackoverflow.com/questions/1057724/what-happens-if-you-increment-an-iterator -थैट-इज़-बराबर-टू-एंड-इटरेटर-ऑफ-ए) – Raedwald

उत्तर

26

यदि आप एंड इटेटरेटर को बढ़ाते हैं, तो परिणाम अपरिभाषित व्यवहार है। तो, यह अंत में रह सकता है, या अंत से बाहर जा सकता है, या अपनी दादी को बकरी के लिए एक लिंक ईमेल कर सकते हैं।

यह भी देखें: What if I increment an iterator by 2 when it points onto the last element of a vector?

+5

आप गंदा नाक के राक्षसों को भूल गए। ':)' – sbi

11

एक आगे इटरेटर के लिए ++ ऑपरेटर पर पूर्व शर्त है कि इटरेटर dereferenceable है। इसका तात्पर्य है कि यह मानचित्र के अंत से पहले नहीं हो सकता है, इसलिए आपका कोड अपरिभाषित व्यवहार देता है। यह सी ++ मानक की धारा 24.1.3 में वर्णित है।

+0

24.2.3 वास्तव में इनपुट इटरेटर के लिए, आउटपुट के लिए 24.2.4। – Ruslan

5

जैसा कि अन्य ने इंगित किया है, एंड इटरेटर को अपरिवर्तित व्यवहार का कारण बनता है, हालांकि यह ध्यान देने योग्य है कि विजुअल स्टूडियो 2008 रनटाइम पर अपने डीबग दावे को फेंक देगा (इसके checked iterators के कारण) यदि आप ऐसा करते हैं।

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