2014-09-16 6 views
6

सी ++ 03 स्टैंडर्ड § 23.2.4.3/3 std::vector::erase(iterator position) वर्णन करता है और विशेष रूप से कहते हैंक्या std :: vector :: मिटाएं() मिटाने के बिंदु पर पुनरावर्तक को अमान्य कर देता है?

मिटा की बात के बाद सभी iterators और संदर्भ अमान्य हो जाएगा।

पर इटरेटर मिटा के बिंदु अवैध नहीं है? विशेष रूप से अगर मैं एक ही तत्व के साथ एक vector है और मैं एक स्थानीय चर में begin() इटरेटर कॉपी और फिर फोन

vec.erase(vec.begin()) 

कि इटरेटर एक स्थानीय चर में मेरे पास अवैध मिलता है या नहीं होगा?

iterators विलोपन की बात या के बाद के बाद और विलोपन के बिंदु सहित अवैध होगी?

+0

इसका मतलब है कि मिटाए जाने के बाद सभी इटरेटर्स को अमान्य कर दिया गया है, इसलिए – radar

+1

"अमान्य" मेरे द्वारा मिटाए गए एक का अर्थ यह है कि ऑब्जेक्ट इटरेटर/संदर्भ का मतलब है कि कहीं भी कहीं बाहर है, आप बस इसे सही ढंग से इंगित नहीं कर रहे हैं। मिटाने के बिंदु के बाद यही होता है। * * क्षरण के बिंदु पर, वस्तु अभी चली गई है। – dlf

+2

@ राजेश: मैं आपको विश्वास दिलाता हूं कि इसका मतलब यह नहीं है। –

उत्तर

8

मैं कहूंगा कि वेक्टर में एकमात्र तत्व को मिटाने के साथ आपका उदाहरण दिखाता है कि सम्मिलन बिंदु पर इटेटरेटर को अमान्य कर दिया जाना चाहिए।

वैसे भी, सी ++ 11 में, शब्दों बदल दिया गया है (23.3.6.5/3):

प्रभाव: पर या मिटा के बिंदु के बाद iterators और संदर्भ अमान्य हो जाएगा।

+2

+1: मुझे C++ 03 में एक संपादकीय समस्या की तरह दिखता है। –

0

vector::erase() की जटिलता का कहना है: रैखिक मिट (विनाश) तत्वों की संख्या के साथ साथ पिछले तत्व नष्ट कर दिया (चलती) के बाद तत्वों की संख्या पर।

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

वास्तव में, यह कार्यान्वयन पर निर्भर हो सकता है। फिर भी मुझे लगता है कि आलसी वृद्धि/संकीर्ण सरणी vector::erase() के लिए सबसे अच्छा फिट कार्यान्वयन है। [चूंकि यह कार्यान्वयन पर निर्भर करता है, अमान्य की तरह कुछ भी गिनती नहीं है ...]

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