2017-02-05 5 views
6

मान लें कि हमारे पास data आकार 5 नामक एक सरणी है। अगर हम जैसेक्यों एक सरणी या वेक्टर में अंतिम तत्व पिछले एक स्मृति स्थान को इंगित करें?

int *ptr = std::end(data); 

std::end कार्य करने के लिए एक तर्क के रूप इस सरणी पारित यह एक सूचक स्मृति स्थान सरणी में पिछले तत्व पिछले एक की ओर इशारा करते वापस आ जाएगी।

प्रश्न

सरणी में अंतिम तत्व के स्मृति स्थान से एक के लिए एक सूचक की ओर इशारा करते होने की बात क्या है? क्यों सरणी में अंतिम तत्व को इंगित नहीं करते?

+4

समानता के कारण। इस तरह सभी पुनरावर्तक विभिन्न कंटेनरों के सभी प्रकारों में समान कार्य करते हैं। और कई कंटेनर सरणी और वेक्टर के रूप में यादृच्छिक पहुंच प्रदान नहीं करते हैं। यह 'i! = J' एकमात्र विकल्प और' i DeiDei

+0

क्योंकि सी ++ में आप आम तौर पर आधा बंद अंतराल के साथ श्रेणियां व्यक्त करते हैं, जिनमें कई सुविधाजनक गुण होते हैं; इस नोटेशन में, एक संपूर्ण कंटेनर को कवर करने वाली सीमा [प्रारंभ, अंत) है, अंत में अंत के बाद एक तत्व होने के साथ। –

+0

यह भी जांचना आसान बनाता है कि एक श्रेणी अपर्याप्त है: 'जबकि (ptr! = End (डेटा)) ...' –

उत्तर

7

इसमें तत्वों के साथ एक "खाली" कंटेनर/अनुक्रम बताने में सक्षम होने के लिए।

यदि कोई कंटेनर खाली है, तो इसके पहले तत्व के लिए एक सूचक अंत में एक अंत होगा, जो "अंत" स्थान जैसा ही होगा।

NULL पॉइंटर का भी उपयोग किया जा सकता था, लेकिन चूंकि हेटरेटर आवश्यक रूप से पॉइंटर्स हैं, NULL लागू नहीं होगा। इटरेटर के लिए डिफ़ॉल्ट मान भी इस्तेमाल किया जा सकता है। जेनेरिक प्रोग्रामिंग में, "डिफ़ॉल्ट" को सभी प्रकारों में समान रूप से कैसे निर्धारित किया जाएगा (यहां दिमाग पूर्व सी ++ 98 कार्यान्वयन को ध्यान में रखें)?

सभी अनुक्रम/कंटेनर स्मृति में संगत नहीं हैं, operator < जैसे तुलना करने के लिए कोई भी प्रयास उपयुक्त नहीं होगा। समानता (या असमानता) का उपयोग, ऑपरेटरों == और != आवश्यक है, इसलिए अंतिम तत्व को इंगित करने के लिए एक बिंदु (या तत्व) की आवश्यकता है; "अंत से पहले एक" हल करता है।

समानता के लिए, "अंत" को अंत में एक के रूप में चुना जाता है; यह कई मुद्दों को हल करता है और एसटीएल को शक्ति लाता है। आधे बंद अंतराल सी ++ में आदर्श बन गया है।

एक तरफ ध्यान दें, श्रेणियों की लाइब्रेरी और तकनीकें इस मामले पर एक और प्रकाश डालती हैं, लेकिन यह तब नहीं था जब एसटीएल की नींव रखी गई थी।

एक और पक्ष नोट; सभी अनुक्रम एक कंटेनर से संबंधित नहीं हैं, कुछ अनुक्रमों को फिर से चालू करने की आवश्यकता होती है जो मूल कंटेनर या अनुक्रम का केवल एक हिस्सा हैं, आधा बंद अंतराल अनुक्रम तक पहुंचने के लिए एक समान तकनीक प्रदान करता है, स्वतंत्र रूप से जहां यह मूल कंटेनर में है/अनुक्रम।

Related

+0

यह जावा इटरेटर्स और संग्रह की तरह हो सकता था। नल का मतलब अब और नहीं है। – Brandon

+1

@ ब्रैंडन यदि आप 20-तत्व कंटेनर के तत्वों 3-13 पर पुनरावृत्त करना चाहते हैं, तो पहले यह एक अलग कंटेनर में डाले बिना काम नहीं करता है। –

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