2013-06-04 6 views
6

मैं वर्तमान में एसटीएल सीख रहा हूं और मुझे ढूंढने और कंस्ट्रेटर्स के बारे में कुछ अनिश्चितताएं मिली हैं। चलो कहते हैं कि मैं एक खोज समारोह करते हैं:सी ++ एसटीएल, निरंतर इटरेटर्स, ढूंढें()

some_stl_container::const_iterator found = myContainer.find(value); 

उसके बाद मैं जाँच करनी चाहिए कि मैं क्या एक और const_iterator के खिलाफ found के लिए मिल गया है, या यह बस एक इटरेटर के खिलाफ एक चेक बनाने के लिए मान्य है।

if(found!=myContainer.cend()) 

और इस: मूल रूप से वहाँ ऐसा करने के बीच कोई अंतर होगा

if(found!=myContainer.end()) 

पहले दिखता है और अधिक सटीक (कम से कम मेरे लिए), लेकिन दूसरे भी ठीक से काम करना चाहिए, है ना?

+0

[गैर-कॉन्स इटरेटर तुलनाओं के आधार पर संभावित डुप्लिकेट, वे वैध हैं] (http://stackoverflow.com/questions/16900498/const-to-non-const-iterator-comparisons-are-they- मान्य) – juanchopanza

+0

ध्यान दें कि सी ++ 11 तक 'सेंडा' मौजूद नहीं था, इसे करने के लिए * कुछ * तरीका होना चाहिए था। –

उत्तर

8

सभी मानक लाइब्रेरी कंटेनर Container::iterator को Container::const_iterator में परिवर्तित करने की आवश्यकता को पूरा करते हैं। तो दोनों तुलना मान्य हैं और एक ही परिणाम उत्पन्न करेंगे। किसी भी iterator श्रेणी आगे इटरेटर आवश्यकताओं को पूरा करती है कि तालिका 96

X::iterator... -

से §23.2.1। परिवर्तनीय X::const_iterator पर।

+0

मजेदार बात यह है कि मैंने अभी पुष्टि की है कि 'x.cend() == एक्स :: const_iterator (x.end()) मानक में। और एक नहीं मिला (शायद मुझे कुछ स्पष्ट तार्किक निष्कर्ष याद आ रहे हैं)। परिभाषा के अनुसार 'x.cend() == const_cast (x) .end() 'लेकिन मुझे नहीं लगता कि यह पहला दावा कैसे साबित करता है। –

+0

@ सेर्ज डंडिच मुझे यकीन नहीं है कि मैं आपका प्रश्न समझता हूं। मैंने जो स्पष्ट रूप से उद्धृत किया है, वह बताता है कि, जब कंटेनरों की बात आती है, तो 'इटरेटर' परिवर्तनीय है 'const_iterator'। यदि आप पूछ रहे हैं कि हमें 2 ऑपरेटर की तुलना करने के लिए 'ऑपरेटर ==' का उपयोग करने की अनुमति मिलती है, तो [इस उत्तर] (http://stackoverflow.com/a/16901637/241631) का संदर्भ लें। – Praetorian

1

यह जांचना कि आपका इटरेटर myContainer.end() से अलग है या नहीं। cend और cbegin विधियां केवल कॉन्स्ट इटेटेटर प्राप्त करने के लिए यहां हैं, इसलिए इससे आपके मामले में कोई फर्क नहीं पड़ता है।

ध्यान दें कि आप C++ 11 auto found = myContainer.find(value) कर सकता है इटरेटर प्रकार अनुमान लगाने के लिए, और कुछ लोगों का तर्क होगा कि कि स्टैंडर्ड पुस्तकालय सही नाम (नहीं एसटीएल) है।

+1

आपकी दूसरी टिप्पणी के बारे में: http://en.wikipedia.org/wiki/Standard_Template_Library – lightxbulb

+0

मेरा मतलब है http://en.wikipedia.org/wiki/C%2B%2B_Standard_Library जो वास्तव में मूल एसटीएल से अलग है (देखें http://stackoverflow.com/questions/5205491/whats-this-stl-vs-c- मानक- लाइब्रेरी- fight-all-about) लेकिन यह दाढ़ी-शुद्धवादी तर्क है: पी –

+0

@lightxbulb: जैसा कि आप लिंक करते हैं वर्णन करने के लिए, एसटीएल एक प्राचीन पुस्तकालय है जो आधुनिक मानक पुस्तकालय के कुछ हिस्सों को प्रेरित करता है। आपका प्रश्न विशेष रूप से सी ++ 11 मानक लाइब्रेरी के बारे में है, एसटीएल नहीं (चूंकि एसटीएल कंटेनरों के पास 'सेंड' फ़ंक्शन नहीं हैं)। –

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