अच्छा, बड़ी समस्या यह है कि वे इटरेटर को आगे नहीं बढ़ा रहे हैं, और ऐसी चीजें हैं जो इटेटरेटर्स की अपेक्षा करते हैं। तो, चीजों को काम करने के लिए आपको कुछ मजाकिया रूपांतरण करना है। कुछ मुद्दों
erase()
के कुछ संस्करणों और insert()
रिवर्स iterators बजाय iterators की आवश्यकता होती है नाम है। इसका मतलब यह है कि यदि आप रिवर्स इटरेटर्स का उपयोग कर रहे हैं और आप insert()
या erase()
चाहते हैं, तो आपको आगे के इटेटरेटर पर हाथ रखने के लिए रिवर्स इटेटरेटर base()
फ़ंक्शन का उपयोग करना होगा। कोई स्वचालित रूपांतरण नहीं है।
base()
सम्मिलन के संदर्भ में रिवर्स इटरेटर के बराबर आगे इटरेटर लौटाता है। यही है, वर्तमान तत्व के सामने आवेषण डालें। तत्व जो रिवर्स इटेटरेटर इंगित कर रहा है, इसलिए base()
पर इंगित करने के लिए गलत तत्व होगा यदि आपको एक तत्व है जो उसी तत्व पर इंगित करता है। तो, यह एक आगे इंगित करता है, और आप इसे सम्मिलन के लिए उपयोग कर सकते हैं।
क्योंकि base()
एक अलग तत्व पर इशारा करते हुए एक पुनरावर्तक देता है, यह erase()
के लिए उपयोग करने का गलत तत्व है। अगर आपको से इटरेटर पर erase()
कहा जाता है, तो आप उस तत्व से कंटेनर में आगे एक तत्व मिटा देंगे जो रिवर्स इटेटरेटर इंगित करता है, इसलिए आपको सही आगे इटेटरेटर प्राप्त करने के लिए base()
पर कॉल करने से पहले रिवर्स इटरेटर को बढ़ाना होगा erase()
के लिए उपयोग करें।
चाहे आप base()
erase()
के साथ erase()
का उपयोग भी कर सकते हैं, तत्व को सही ढंग से मिटाने के लिए पूरी तरह से आपके कार्यान्वयन पर निर्भर करता है। यह जीसीसी के साथ काम करता है, लेकिन विजुअल स्टूडियो के साथ वे वास्तव में एक फॉरवर्ड इटरेटर को इस तरह से लपेट रहे हैं जो इसे बनाता है ताकि यह रिवर्स इटरेटर्स और विजुअल स्टूडियो से निपटने पर erase()
का उपयोग करने के लिए काम न करे। मुझे याद नहीं है कि insert()
में एक ही समस्या है, लेकिन रिवर्स इटेटरेटर सी ++ के विभिन्न कार्यान्वयन के बीच काम नहीं करते हैं (विजुअल स्टूडियो लड़कों के अनुसार, मानक पर्याप्त स्पष्ट नहीं था), इसलिए यह बालों का प्रकार हो सकता है एक कंटेनर पर बसने के अलावा उन्हें किसी अन्य चीज़ के लिए उपयोग करने के लिए।
रूप में अच्छी तरह शायद अन्य मुद्दों कर रहे हैं, लेकिन इटरेटर किसी भी प्रकार की एक गैर स्थिरांक, C++ जब बस एक कंटेनर से अधिक पुनरावृत्ति को छोड़कर सब कुछ एक सा बालों प्राप्त कर सकते हैं आगे इटरेटर के अलावा अन्य के साथ काम - अगर आप इसे सब कुछ भी कर सकते हैं - क्योंकि इतने सारे फ़ंक्शंस को किसी अन्य प्रकार के इटरेटर की बजाय गैर-कॉन्स फॉरवर्डर की आवश्यकता होती है।
यदि आप वास्तव में विभिन्न पुनरावृत्तियों के प्रकार और उनके साथ जुड़े मुद्दों के बीच अंतर जानना चाहते हैं, तो मैं स्कॉट मेयर के प्रभावी एसटीएल पढ़ने की सलाह देता हूं। यह इटरेटर पर एक महान अध्याय है।
संपादित करें: बूस्ट के रिवर्स इटेटरेटर उन कमियों को कैसे सुधारता है, मुझे डर है कि मेरे पास कोई सुराग नहीं है। मुझे कुछ मानक रिवर्स इटेटरेटर की कमियों के बारे में पता है और अतीत में उनके द्वारा काटा गया है, लेकिन मैंने कभी भी बूस्ट का उपयोग नहीं किया है, इसलिए मैं उनके रिवर्स इटेटरेटर्स से बिल्कुल परिचित नहीं हूं। माफ़ कीजिये।
स्रोत
2010-07-08 20:29:59
यह अक्सर थोड़ा ..... समय था। –
एक टिप्पणी के रूप में पोस्ट करना क्योंकि मैं अनुमान लगा रहा हूं: 'std :: reverse_iterator <>' के प्रारंभिक कार्यान्वयन में कभी-कभी बग होती थीं। बूस्ट बस उस स्थिति के खिलाफ अपनाने की कोशिश कर रहा है। शायद टिप्पणी मानक में कमियों की बजाय 'रिवर्स_इटरेटर' कार्यान्वयन में कमियों के बारे में अधिक है? –