2012-09-05 29 views
8

अधिकांश कंटेनर के लिए, iterator प्रकार कंटेनर में मानों को पढ़ने-लिखने की पहुंच प्रदान करता है, और const_iterator प्रकार केवल पढ़ने के लिए पहुंच प्रदान करता है। हालांकि, std::set<T> के लिए, इटरेटर प्रकार रीड-राइट एक्सेस प्रदान नहीं कर सकता है, क्योंकि सेट में एक मान को संशोधित करना (संभावित रूप से) कंटेनर इनविरिएंट को तोड़ देता है। इसलिए, std::set<T> में, iterator और const_iterator दोनों केवल पढ़ने के लिए उपलब्ध हैं।क्या std :: set :: iterator और std :: set :: const_iterator के बीच कोई परिचालन अंतर है?

यह मुझे मेरे प्रश्न पर ले जाता है: क्या std::set<T>::iterator और std::set<T>::const_iterator के साथ आप जो कुछ कर सकते हैं, उसके बीच कोई अंतर है?

ध्यान दें कि सी ++ 11 में, कंटेनर के मैनिपुलेशन विधियां (उदा।, erase) const_iterator तर्क ले सकते हैं।

उत्तर

6

नहीं, उनके बीच बहुत अधिक कार्यात्मक अंतर नहीं है। बेशक, वहां का उपयोग C++ 03 में वापस करने के लिए किया गया था, जब set<T>::iteratorconst T& वापस नहीं आया था। लेकिन एक बार जब उन्होंने इसे बदल दिया, तो वे दो अलग-अलग प्रकार के इटरेटर के साथ फंस गए थे जो दोनों एक ही काम करते हैं।

वास्तव में, मानक स्पष्ट है कि उनके पास समान कार्यक्षमता है (उस बिंदु पर जहां वे एक ही प्रकार के हो सकते हैं, लेकिन होने की आवश्यकता नहीं है)। 23.2.4 से, पी। 6:

iterator एक सहयोगी कंटेनर का बिडरेक्शनल इटरेटर श्रेणी है। सहयोगी कंटेनरों के लिए जहां मान प्रकार कुंजी प्रकार के समान होता है, iterator और const_iterator दोनों स्थिर इटरेटर हैं। यह अनिश्चित है कि iterator और const_iterator समान प्रकार के हैं या नहीं। [नोट:iterator और const_iterator इस मामले में समान अर्थशास्त्र है, और iterator परिवर्तनीय है const_iterator। उपयोगकर्ता अपने फ़ंक्शन पैरामीटर सूचियों में हमेशा const_iterator का उपयोग करके एक परिभाषा नियम का उल्लंघन करने से बच सकते हैं। - अंत टिप्पणी]

1

जब हम (अरे मैं) कुलपति 10.0 करने के लिए हमारे बड़े एप्लिकेशन पोर्ट, इस नियम को प्रभावित लिया। इसने पुराने कोड के सभी प्रकार तोड़ दिए जहां लोगों ने उन पर गैर-कॉन्स्टेंस विधियों को बुलाकर इटरेटर को घुमाया।

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

आशा है कि मदद करता है।