2011-03-26 5 views
9

अनुभाग §24.1/5 सी ++ स्टैंडर्ड से (2003) में लिखा है,एसटीएल इटरेटर्स के संदर्भ में एकवचन और गैर-एकवचन मूल्य क्या है?

बस के रूप में एक सरणी अंतिम तत्व सरणी के अतीत ओर इशारा करते हुए एक सूचक मूल्य नहीं होता है गारंटी देता है कि करने के लिए एक नियमित रूप से सूचक, इसलिए किसी भी इटरेटर प्रकार के लिए एक इटरेटर मान है जो संबंधित कंटेनर के अंतिम तत्व से पहले इंगित करता है। ये मान को पिछले-अंत-अंत मान कहा जाता है। एक इटरेटर के मान I जिसके लिए अभिव्यक्ति * मुझे परिभाषित किया गया है अस्वीकार्य कहा जाता है। पुस्तकालय कभी भी मानता है कि पिछले-अंत-अंत मान भरोसेमंद हैं। Iterators भी में एकवचन मान हो सकते हैं जो किसी भी कंटेनर से जुड़े नहीं हैं। [उदाहरण:। के अप्रारंभीकृत सूचक एक्स घोषणा के बाद (साथ पूर्णांक * एक्स के रूप में;), एक्स हमेशा एक सूचक की एक विलक्षण मान होना मान लिया जाना चाहिए] सबसे अभिव्यक्ति की परिणाम के लिए अपरिभाषित हैं एकवचन मूल्य; केवल अपवाद एक असाइनर के लिए गैर-एकवचन मान का असाइनमेंट है जो एकवचन मान रखता है। इस मामले में एकवचन मान को किसी भी अन्य मूल्य के रूप में ओवरराइट किया गया है। भरोसेमंद मान हमेशा नॉनसिंगुलर होते हैं।

मैं वास्तव में पाठ बोल्ड में दिखाया गया है समझ में नहीं आ सकता है?

  • एकवचन मूल्य और गैर-मूल्यवान मूल्य क्या है? वे कैसे परिभाषित किए जाते हैं? और कहाँ?
  • कैसे और क्यों अपरिवर्तनीय मान हमेशा नॉनसिंगुलर हैं?

उत्तर

8

Iterators एकवचन मान है कि किसी भी कंटेनर साथ संबद्ध नहीं हैं हो सकता है।

मुझे लगता है कि इसकी परिभाषा है।

कैसे और क्यों माननीय मूल्य हमेशा नॉनसिंगुलर होते हैं?

क्योंकि यदि वे नहीं करेंगे, तो उन्हें अस्वीकार करना अपरिभाषित व्यवहार होगा।

8

यदि मैं इसे सही ढंग से समझता हूं, तो एक इटरेटर के लिए एकवचन मूल्य अनिवार्य रूप से एक असाइन किए गए पॉइंटर के बराबर है। यह एक पुनरावर्तक है जिसे कहीं भी इंगित करने के लिए प्रारंभ नहीं किया गया है और इस प्रकार इसका कोई भी परिभाषित तत्व नहीं है जो इसे खत्म कर रहा है। एक नया इटरेटर घोषित करना जो कि किसी श्रेणी के तत्व को इंगित करने के लिए सेट नहीं है, उदाहरण के लिए, इसे एकवचन इटरेटर के रूप में इटेटरेटर बनाता है।

जैसा कि spec के हिस्से को दर्शाता है, एकवचन इटरेटर असुरक्षित हैं और मानक इटरेटर ऑपरेशंस जैसे कि वृद्धि, असाइनमेंट इत्यादि का उपयोग नहीं किया जा सकता है। आप जो भी कर सकते हैं उन्हें एक नया मान असाइन करना है, उम्मीद है कि उन्हें वैध डेटा पर इंगित करना होगा।

मुझे लगता है कि इस परिभाषा होने का कारण है ताकि

set<int>::iterator itr; 

बयान की तरह कल्पना द्वारा अनुमति दी जा सकता है, जबकि मानकीकृत अर्थ होने। यहां "सिंगुलर" शब्द शायद एकवचन की गणितीय परिभाषा को संदर्भित करता है, जिसे कम औपचारिक सेटिंग्स में "असंतोष" भी कहा जाता है।

+0

क्या डिफॉल्ट-निर्मित 'istream_iterator' को एकवचन माना जा सकता है? –

+1

मुझे ऐसा नहीं लगता है। यह एक वैध अतीत-अंत-अंतराल वाला है। यदि यह एकवचन था, तो आप इसे स्ट्रीम के एनएफएफ को परिभाषित करने के लिए उपयोग नहीं कर सके, क्योंकि आप इसे किसी अन्य इटरेटर से तुलना नहीं कर सके। – templatetypedef

2

What is an iterator's default value? पर एक नज़र डालें।

चूंकि उद्धरण इंगित करता है, एकवचन मूल्य इटरेटर मान हैं जो किसी भी कंटेनर से जुड़े नहीं हैं। एकवचन मूल्य लगभग बेकार है: आप इसे अग्रिम नहीं कर सकते हैं, इसे अस्वीकार कर सकते हैं, आदि। एकमात्र इटरेटर प्राप्त करने का एक तरीका (एकमात्र तरीका?) इसे प्रारंभ नहीं कर रहा है, जैसा कि templatetypedef के उत्तर में दिखाया गया है।

उपयोगी चीजें आप एक विलक्षण इटरेटर साथ कर सकते हैं में से एक, आवंटित यह एक गैर विलक्षण मूल्य है। जब आप ऐसा करते हैं तो आप जो कुछ भी चाहते हैं वह कर सकते हैं।

गैर-एकवचन मूल्य लगभग परिभाषा के अनुसार हैं, इटरेटर मूल्य कंटेनर से जुड़े हैं। यह उत्तर देता है कि क्यों माननीय मान हमेशा गैर-एकवचन होते हैं: इटरेटर जो किसी भी कंटेनर को इंगित नहीं करते हैं, को संदर्भित नहीं किया जा सकता है (यह किस तत्व को वापस करेगा?)।

मैथ्यू एम के रूप में सही ढंग से नोट किया गया है, गैर-एकवचन मूल्य अभी भी गैर-भरोसेमंद हो सकते हैं। एक उदाहरण अतीत-एंड-एंड इटरेटर (कंटेनर.एंड() को कॉल करके प्राप्त किया जा सकता है): यह एक कंटेनर से जुड़ा हुआ है, लेकिन अभी भी संदर्भित नहीं किया जा सकता है।

मैं नहीं कह सकता कि ये शब्द कहां परिभाषित किए गए हैं। (अन्य परिभाषाओं के अलावा): लेकिन, गूगल इस "एकवचन परिभाषित": के बारे में क्या कहना है

remarkable: unusual or striking 

मुझे लगता है इस शब्दावली की व्याख्या कर सकते हैं।

+1

देखें! गैर-एकवचन मूल्यों में अतीत के अंतरालकर्ता शामिल हैं, इसे किसी भी संदर्भित नहीं किया जा सकता है। –

+0

@Matthieu: आप 100% सही हैं। मैंने यह जवाब देने के लिए अपना जवाब अपडेट कर दिया है कि गैर-एकवचन मूल्य अभी भी अपरिवर्तनीय हो सकते हैं। धन्यवाद! – telewin

2

एकवचन मूल्य और गैर-मूल्यवान मूल्य क्या है? वे कैसे परिभाषित किए जाते हैं? और कहाँ?

हमें Iterator: सूचक का सबसे सरल अवतार का उपयोग करने दें।

एक सूचक के लिए:

  • विलक्षण मूल्य alluded को है शून्य मूल्य एक गैर-आरंभिकृत मूल्य।
  • एक गैर विलक्षण मूल्य, एक स्पष्ट रूप से प्रारंभ मूल्य है यह अभी भी dereferencable नहीं हो सकता है (पास्ट अंत सूचक dereferenced नहीं किया जाएगा)

मैं कहूँगा कि NULL सूचक एक विलक्षण मूल्य है हालांकि, केवल एक ही नहीं है, क्योंकि यह मूल्य की अनुपस्थिति का प्रतिनिधित्व करता है।

नियमित पुनरावृत्तियों के लिए समानता क्या है?

std::vector<int>::iterator it;, अधिकांश इटरेटर (एक कंटेनर से जुड़े लोगों) का डिफ़ॉल्ट कन्स्ट्रक्टर एकवचन मूल्य बनाता है। चूंकि यह किसी कंटेनर से बंधे नहीं है, इसलिए नेविगेशन का कोई भी रूप (वृद्धि, कमी, ...) व्यर्थ है।

कैसे और क्यों माननीय मूल्य हमेशा नॉनसिंगुलर होते हैं?

परिभाषा के अनुसार, एकल मूल्य, वास्तविक मूल्य की अनुपस्थिति का प्रतिनिधित्व करते हैं। वे कई भाषाओं में दिखाई देते हैं: पायथन का None, सी # null, सी का NULL, सी ++ का std::nullptr। पकड़ यह है कि सी या सी ++ में, वे भी सरल कचरा हो सकते हैं ... (जो भी पहले स्मृति में था)

क्या एक डिफ़ॉल्ट निर्मित इटरेटर एकवचन मूल्य है?

जरूरी नहीं, मुझे लगता है। यह मानक द्वारा आवश्यक नहीं है, और कोई एक सेंटीनेल ऑब्जेक्ट के उपयोग की कल्पना कर सकता है।

+0

मैं वही लाइनों पर सोच रहा था जैसा आपने किया था, * एकवचन * इटरेटर एक शून्य सूचक या 'std :: istream_iterator ()' जैसी चीज़ों का जिक्र करते हैं, लेकिन फिर मैंने उद्धरण के दो बार फिर से पढ़ा और निष्कर्ष पर पहुंचा यह मामला नहीं हो सकता है। एक गारंटी है कि आप केवल असाइन नहीं कर सकते हैं, बल्कि नल पॉइंटर्स (या 'std :: istream_iterator ()' की तुलना भी कर सकते हैं, इसलिए मुझे अब यह विश्वास नहीं है कि यह व्याख्या है। –

+0

@ डेविड: मुझे लगता है कि मानक यहां अस्पष्ट है * * का * केवल * अपवाद * का उपयोग * संदिग्ध है, क्यों नहीं * सभी */* को छोड़कर * ऐसा लगता है कि वे प्रारंभिक मानों के साथ-साथ (उदाहरण की तरह) के लिए भी खाते हैं और न केवल शून्य मान –

+0

"उल्लिखित एकवचन मूल्य" वास्तव में _not_ 'NULL' है। उद्धृत उदाहरण पाठ स्पष्ट है:" एक प्रारंभिक सूचक x (जैसा कि 'int * x;' के साथ) की घोषणा के बाद, x को हमेशा माना जाना चाहिए एक सूचक का एकवचन मूल्य। "अब, एक प्रारंभिक सूचक 'न्यूल' नहीं है। आप इसे 'न्यूल' से भी तुलना नहीं कर सकते। – MSalters

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