2010-07-08 11 views
17

बूस्ट के specialized iterator adaptors के लिए प्रलेखन बताता है कि boost::reverse_iterator "सी ++ 98 के std :: reverse_iterator की कई कमियों को ठीक करता है।"std :: reverse_iterator की कमियों क्या हैं?

ये कमियां क्या हैं? मुझे इन कमियों का विवरण नहीं मिल रहा है।

अनुवर्ती प्रश्न:

कैसे को बढ़ावा देने करता :: reverse_iterator इन कमियों को दूर?

+1

यह अक्सर थोड़ा ..... समय था। –

+0

एक टिप्पणी के रूप में पोस्ट करना क्योंकि मैं अनुमान लगा रहा हूं: 'std :: reverse_iterator <>' के प्रारंभिक कार्यान्वयन में कभी-कभी बग होती थीं। बूस्ट बस उस स्थिति के खिलाफ अपनाने की कोशिश कर रहा है। शायद टिप्पणी मानक में कमियों की बजाय 'रिवर्स_इटरेटर' कार्यान्वयन में कमियों के बारे में अधिक है? –

उत्तर

10

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

  1. erase() के कुछ संस्करणों और insert() रिवर्स iterators बजाय iterators की आवश्यकता होती है नाम है। इसका मतलब यह है कि यदि आप रिवर्स इटरेटर्स का उपयोग कर रहे हैं और आप insert() या erase() चाहते हैं, तो आपको आगे के इटेटरेटर पर हाथ रखने के लिए रिवर्स इटेटरेटर base() फ़ंक्शन का उपयोग करना होगा। कोई स्वचालित रूपांतरण नहीं है।

  2. base() सम्मिलन के संदर्भ में रिवर्स इटरेटर के बराबर आगे इटरेटर लौटाता है। यही है, वर्तमान तत्व के सामने आवेषण डालें। तत्व जो रिवर्स इटेटरेटर इंगित कर रहा है, इसलिए base() पर इंगित करने के लिए गलत तत्व होगा यदि आपको एक तत्व है जो उसी तत्व पर इंगित करता है। तो, यह एक आगे इंगित करता है, और आप इसे सम्मिलन के लिए उपयोग कर सकते हैं।

  3. क्योंकि base() एक अलग तत्व पर इशारा करते हुए एक पुनरावर्तक देता है, यह erase() के लिए उपयोग करने का गलत तत्व है। अगर आपको से इटरेटर पर erase() कहा जाता है, तो आप उस तत्व से कंटेनर में आगे एक तत्व मिटा देंगे जो रिवर्स इटेटरेटर इंगित करता है, इसलिए आपको सही आगे इटेटरेटर प्राप्त करने के लिए base() पर कॉल करने से पहले रिवर्स इटरेटर को बढ़ाना होगा erase() के लिए उपयोग करें।

  4. चाहे आप base()erase() के साथ erase() का उपयोग भी कर सकते हैं, तत्व को सही ढंग से मिटाने के लिए पूरी तरह से आपके कार्यान्वयन पर निर्भर करता है। यह जीसीसी के साथ काम करता है, लेकिन विजुअल स्टूडियो के साथ वे वास्तव में एक फॉरवर्ड इटरेटर को इस तरह से लपेट रहे हैं जो इसे बनाता है ताकि यह रिवर्स इटरेटर्स और विजुअल स्टूडियो से निपटने पर erase() का उपयोग करने के लिए काम न करे। मुझे याद नहीं है कि insert() में एक ही समस्या है, लेकिन रिवर्स इटेटरेटर सी ++ के विभिन्न कार्यान्वयन के बीच काम नहीं करते हैं (विजुअल स्टूडियो लड़कों के अनुसार, मानक पर्याप्त स्पष्ट नहीं था), इसलिए यह बालों का प्रकार हो सकता है एक कंटेनर पर बसने के अलावा उन्हें किसी अन्य चीज़ के लिए उपयोग करने के लिए।

रूप में अच्छी तरह शायद अन्य मुद्दों कर रहे हैं, लेकिन इटरेटर किसी भी प्रकार की एक गैर स्थिरांक, C++ जब बस एक कंटेनर से अधिक पुनरावृत्ति को छोड़कर सब कुछ एक सा बालों प्राप्त कर सकते हैं आगे इटरेटर के अलावा अन्य के साथ काम - अगर आप इसे सब कुछ भी कर सकते हैं - क्योंकि इतने सारे फ़ंक्शंस को किसी अन्य प्रकार के इटरेटर की बजाय गैर-कॉन्स फॉरवर्डर की आवश्यकता होती है।

यदि आप वास्तव में विभिन्न पुनरावृत्तियों के प्रकार और उनके साथ जुड़े मुद्दों के बीच अंतर जानना चाहते हैं, तो मैं स्कॉट मेयर के प्रभावी एसटीएल पढ़ने की सलाह देता हूं। यह इटरेटर पर एक महान अध्याय है।

संपादित करें: बूस्ट के रिवर्स इटेटरेटर उन कमियों को कैसे सुधारता है, मुझे डर है कि मेरे पास कोई सुराग नहीं है। मुझे कुछ मानक रिवर्स इटेटरेटर की कमियों के बारे में पता है और अतीत में उनके द्वारा काटा गया है, लेकिन मैंने कभी भी बूस्ट का उपयोग नहीं किया है, इसलिए मैं उनके रिवर्स इटेटरेटर्स से बिल्कुल परिचित नहीं हूं। माफ़ कीजिये।

+1

मुझे यकीन नहीं है कि मैं देख रहा हूं कि आप क्या प्राप्त कर रहे हैं। कोड "अग्रेषित" उम्मीदवारों को किसी भी अंतर को "नोटिस" नहीं करना चाहिए जब तक कि वे अपरिभाषित व्यवहार के साथ काम न करें ... – Cogwheel

+1

सी ++ 03 में 'std :: reverse_iterator' टेम्पलेट अंतर्निहित पुनरावर्तक के रूप में इटरेटर की उसी श्रेणी का खुलासा करता है कम से कम एक द्वि-दिशात्मक पुनरावर्तक होना चाहिए, इसलिए एक रिवर्स_इटरेटर हमेशा कम से कम एक द्वि-डी इटरेटर (और इसलिए एक आगे इटरेटर) होता है। –

+1

मुझे विश्वास नहीं है कि आप यहां सही हैं। मेरा मानना ​​है कि एक रिवर्स_इटरेटर वास्तव में एक आगे इटेटरेटर है। कम से कम मुझे नहीं लगता कि यह उस अवधारणा का उल्लंघन कहां करता है। –

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