2009-05-28 8 views
11

एक इटरेटर बनाम इंडेक्स का उपयोग कर वेक्टर तत्वों तक पहुंचने में क्या फायदे हैं?एक इटरेटर बनाम इंडेक्स का उपयोग कर वेक्टर तत्वों को accesing के बीच क्या अंतर है?

+1

'क्रम में सभी तत्वों' (यानी पुनरावृत्त) तक पहुंचने और 'एक यादृच्छिक तत्व' (यानी एक्सेसिंग) तक पहुंचने के लिए betweeen को अलग करें। – xtofl

उत्तर

8

इटेटरेट इंडेक्स से बेहतर क्यों हैं?

  • उन मामलों में जहां इंडेक्स उपलब्ध नहीं है (जैसे std :: सूची, उदाहरण के लिए)।
  • ऐसे मामले में जहां एक जेनेरिक फ़ंक्शन एक इटरेटर को स्वीकार करता है।
  • एक फ़ंक्शन टेम्पलेट लिखते समय के साथ एक से अधिक कंटेनर प्रकार के साथ काम करना चाहिए।
  • वे सभी कंटेनर और सभी मानक एल्गोरिदम में सभी कंटेनर 'iterators के साथ ही नियमित रूप से संकेत उपयोग करने की क्षमता के बीच एकरूपता बनाने के लिए मौजूद हैं।
  • इटरेटर उन दृश्यों को इंगित कर सकते हैं जो अवधारणा को छोड़कर मौजूद नहीं हैं। उदाहरण के लिए, आप एक इटरेटर क्लास बना सकते हैं जो प्राइम संख्याओं के माध्यम से वास्तव में प्राइम्स का कंटेनर बनाने के बिना कदम उठा सकता है।

हालांकि, कंटेनर प्रकार है कि रैंडम एक्सेस (सूची, सेट, आदि) का समर्थन नहीं करते अनदेखी करता है, तो, iterators अभी भी

  • सूचक अर्थ विज्ञान की तरह की पेशकश (स्ट्रिंग :: iterator बनाम चार के बारे में सोच *)।
  • सामान्यीकृत अवधारणा कंटेनर के अंदर तत्वों पर पुनरावृत्ति से परे प्रयोग योग्य है।
  • कुछ मामलों में कंटेनर सदस्य कार्यों से बेहतर प्रदर्शन।
+3

मैं सहमत हूं, और विशेष रूप से मैं एक बहुत ही व्यावहारिक लाभ पर उच्चारण डाल दूंगा: इटरेटर का उपयोग कर वेक्टर के तत्वों में साइकिल चलाना एक-एक-एक परिस्थितियों के लिए त्रुटि सुरक्षित है। अधिक सरलता से, वेक्टरों के लिए इटरेटर का उपयोग किसी भी प्रकार का आकार-अज्ञेयवादी है। –

+0

जब तक आपको अनुक्रमिक पहुंच की आवश्यकता हो, आप सही हैं। अन्य मामलों में, कोई समानता नहीं है। – xtofl

4

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

1

इस प्रश्न को हाल ही में प्रदर्शन के संबंध में मुझसे पूछा गया था। हो सकता है कि आप मेरे द्वारा प्राप्त उत्तरों पर नज़र डालें।

चेक दिए गए लिंक: Iterators vs. indexes

चर्चा प्रदर्शन है, जो निकला मंच निर्भर होना, एक मंच में मामूली परिवर्तन के साथ के बारे में मुख्य रूप से किया गया था।

+0

क्या आप कहेंगे तो इटेटरेटर्स के फायदे यह ऑपरेटर की तरह पॉइंटर है जो कुछ तरीकों से प्रदान किया जाता है? – Babiker

+0

यह वह नहीं है जो मैं कह रहा हूं, मैंने केवल प्रदर्शन पहलू को संदर्भित किया है। –

+1

+1 भले ही सवाल इटरेटर के साथ फायदे के बारे में था। लेकिन इटरेटर ओवरहेड का कारण बनते हैं। और यह बहुत ध्यान देने योग्य है। – ralphtheninja

3

मैं कंटेनरों में इसकी पोर्टेबिलिटी कहता हूं।

यदि आप वेक्टर का उपयोग करके कोड लिखते हैं और फिर से इंडेक्स का उपयोग करते हैं तो कोड को आसानी से बाद में अन्य कंटेनर में बदला नहीं जा सकता है।

typedef std::vector<int> myContainer; //only change here for std::list 

for (myContainer::iterator iter = actualContainer.begin(); 
     iter != actualContainer.end(); 
     ++iter) 
{} 

उपरोक्त कोड में यदि आप वेक्टर से सूची में बदलना चाहते हैं, तो यह बहुत आसानी से संभव है। यदि आपने इंडेक्स का उपयोग किया था तो यह संभव नहीं होगा।

अन्यथा वेक्टर यादृच्छिक अभिगम इटरेटर का उपयोग करता है, यह वही होना चाहिए।(इंडेक्स या इटरेटर कुछ भी ठीक है)

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