एक पुनरावर्तक कंटेनर के समान नहीं है। इटरेटर कंटेनर में एक ही आइटम को संदर्भित करता है, साथ ही साथ अन्य वस्तुओं तक पहुंचने के तरीके भी प्रदान करता है।
इटरेटर के बिना अपने कंटेनर को डिजाइन करने पर विचार करें। इसमें size
फ़ंक्शन हो सकता है जिसमें आइटम शामिल हैं, और []
ऑपरेटर को अधिभारित कर सकता है ताकि आप किसी आइटम को अपनी स्थिति से प्राप्त कर सकें या सेट कर सकें।
लेकिन उस तरह की "यादृच्छिक पहुंच" किसी प्रकार के कंटेनर पर कुशलता से लागू करना आसान नहीं है। यदि आप लाखवें आइटम प्राप्त करते हैं: c[1000000]
और कंटेनर आंतरिक रूप से एक लिंक्ड सूची का उपयोग करता है, तो उसे इच्छित एक ढूंढने के लिए उसे दस लाख आइटम स्कैन करना होगा।
आप संग्रह को "वर्तमान" आइटम को याद रखने की अनुमति देने का निर्णय ले सकते हैं। यह start
और more
और next
जैसे कार्यों सामग्री लूप करने के लिए आप की अनुमति के लिए हो सकता है:
c.start();
while (c.more())
{
item_t item = c.next();
// use the item somehow
}
लेकिन इस कंटेनर के अंदर "यात्रा राज्य" डालता है। यह एक गंभीर सीमा है। क्या होगा यदि आप प्रत्येक आइटम को कंटेनर में हर दूसरे आइटम से तुलना करना चाहते हैं? इसके लिए दो नेस्टेड लूप की आवश्यकता होती है, दोनों वस्तुओं के माध्यम से पुनरावृत्त होते हैं। यदि कंटेनर खुद ही पुनरावृत्ति की स्थिति को संग्रहीत करता है, तो आपके पास दो ऐसे पुनरावृत्तियों को घोंसला करने का कोई तरीका नहीं है - आंतरिक लूप बाहरी पाश के काम को नष्ट कर देगा।
तो इटेटर एक पुनरावृत्ति स्थिति की एक स्वतंत्र प्रति हैं।
container_t::iterator i = c.begin();
कि इटरेटर, i
, एक अलग वस्तु है कि कंटेनर के भीतर की स्थिति का प्रतिनिधित्व करता है: आप एक यात्रा शुरू कर सकते हैं। आप प्राप्त कर सके जो कुछ भी स्थिति में संग्रहीत किया जाता है:
item_t item = *i;
आप अगले आइटम पर जाने कर सकते हैं:
i++;
कुछ iterators साथ
आप आगे कई मदों को छोड़ कर सकते हैं:
i += 1000;
या इटरेटर द्वारा पहचाने गए स्थिति से संबंधित किसी स्थिति पर एक आइटम प्राप्त करें:
item_t item = i[1000];
और कुछ इटरेटर के साथ आप पीछे की ओर बढ़ सकते हैं।
और तुम end
को इटरेटर की तुलना द्वारा यदि आप कंटेनर की सामग्री को परे पहुँच गए हैं की खोज कर सकते हैं: पुनरावर्तक है कि एक स्थिति यह है कि एक से परे है का प्रतिनिधित्व करता है लौटने के रूप में
while (i != c.end())
आप end
के बारे में सोच सकते हैं कंटेनर में अंतिम स्थिति।
इटरेटर (और आमतौर पर सी ++ में) के बारे में जागरूक होने का एक महत्वपूर्ण बिंदु यह है कि वे अमान्य हो सकते हैं। यह आम तौर पर उदाहरण के लिए होता है यदि आप एक कंटेनर खाली करते हैं: उस कंटेनर में स्थितियों को इंगित करने वाले किसी भी इटरेटर अब अमान्य हो गए हैं। उस स्थिति में, उन पर अधिकतर परिचालन अनिर्धारित हैं - कुछ भी हो सकता है!
- कंटेनरों
- एल्गोरिदम
- Iterators
वैचारिक स्तर कंटेनर डेटा पकड़ में:
+1 अच्छा स्पष्टीकरण। – Nawaz