2010-04-28 11 views
26

इटरेटर के साथ कोड पॉइंटर्स के साथ कोड की तरह दिखता है। Iterators कुछ अस्पष्ट प्रकार के हैं (उदाहरण के लिए std::vector<int>::iterator)।इटरेटर और पॉइंटर्स कैसे संबंधित हैं?

मुझे क्या नहीं मिलता है कि इटेटर और पॉइंटर एक-दूसरे से कैसे जुड़े होते हैं - एक इटरेटर एक ओवररेटेड ऑपरेशंस के साथ एक पॉइंटर के आस-पास एक आवरण होता है जो निकटवर्ती तत्वों तक आगे बढ़ता है या यह कुछ और है?

उत्तर

44

इटरेटर पॉइंटर्स का एक सामान्यीकरण हैं।

एक इटरेटर (वेरिएंट के आधार पर) को लागू करना * और ++

तो एक सूचक पुनरावर्तक है। लेकिन जरूरी नहीं कि दूसरे तरीके से गोल करें।

यदि आप एक जटिल संरचना (एक पेड़, एक ग्राफ ...) पर फिर से शुरू करना चाहते हैं, तो इटेटरेटर पॉइंटर से कहीं अधिक होगा, और राम में कुछ वास्तविक स्थान का कोई संदर्भ नहीं देता है।

+7

क्या हम कह सकते हैं कि सूचक इटरेटर का सबसेट है? – solti

+7

हाँ, बिल्कुल –

7

संकल्पनात्मक रूप से, हाँ - लेकिन उन्हें पॉइंटर्स नहीं होने चाहिए। उनके आंतरिक और क्षमताओं डेटा संरचना पर निर्भर करेगा जो वे "लपेटें"।

यही कारण है कि अलग "classes" of iterators हैं। जैसे यूनिडायरेक्शनल, बिडरेक्शनल, रैंडमएप, इत्यादि

कुछ कई कक्षाओं में सक्षम हैं।

उदा। यदि आंतरिक संरचना एक लाल-काले पेड़ या लिंक्ड लिस्ट है, तो इटरेटर बिडरेक्शनल हो सकते हैं, लेकिन RandomAccess नहीं। यदि वे एक वेक्टर (एक सरणी के रूप में लागू) लपेटते हैं, तो आपके पास RandomAccess और Bidirectional होगा।

7

इटरेटर ऐसी ऑब्जेक्ट्स हैं जो कुछ ऑपरेटरों को अधिभारित करते हैं, इसलिए उपयोग दिखेगा जैसे वे पॉइंटर्स थे। यह किसी दिए गए इटरेटर श्रेणी की क्षमताओं के भीतर है। यादृच्छिक अभिगम इटरेटर पूरी तरह से पॉइंटर्स की तरह दिखते हैं, अन्य प्रकार के इटरेटर कुछ ऑपरेशन प्रदान नहीं करते हैं (उदाहरण के लिए list<X>::iterator जो कि बिडरेक्शनल में ऑपरेटर += नहीं है, जिसमें कई अन्य लोगों के लिए यादृच्छिक पहुंच की आवश्यकता होगी)।

"अस्पष्ट नाम", यह पूरी तरह से एक इटरेटर के लिए एक सादे सूचक का उपयोग करने के अकल्पनीय नहीं है करने के लिए के रूप में:

template <class T> 
class MyContainer 
{ 
    ... 
    typedef T* iterator; 
} 

MyContainer<int>::iterator it; //the type is really int* 
3

एक इटरेटर है सिर्फ एक अवधारणा है कि इंटरफेस iterators के लिए आवश्यक प्रदान करता है - इन अलग हैं विभिन्न प्रकार के इटरेटर्स के लिए और सी ++ मानक (इटरेटर आवश्यकताएं) की धारा 24.1 में निर्दिष्ट हैं।

कैसे इटेटरेटर्स लागू किए जाते हैं, वे वेक्टरों के लिए निर्भर करते हैं - वेक्टरों के लिए आमतौर पर एक सिरे के लिए एक पॉइंटर के आसपास एक रैपर होते हैं (रिलीज में वैसे भी), अधिक जटिल कंटेनरों के लिए उनके पास अधिक जटिल कार्यान्वयन होता है। खुले अंतराल श्रेणियों के लिए वे तत्व उत्पन्न करने के लिए उपयोग किए जाने वाले एल्गोरिदम की स्थिति को शामिल करेंगे।

ध्यान दें कि किसी सरणी में किसी तत्व के लिए पॉइंटर एक यादृच्छिक अभिगम इटरेटर की आवश्यकताओं को पूरा करता है, इसलिए कुछ हद तक वे अदला-बदले होते हैं।

+2

मुझे लगता है कि शब्द * टाइप * के बजाय * अवधारणा * है। –

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