2017-01-25 7 views
6

Angew made a comment का उल्लंघन करता है जो एक कच्चे सूचक का उपयोग करते हुए vector है क्योंकि यह इटरेटर प्रकार ठीक था। उस तरह ने मुझे एक पाश के लिए फेंक दिया।कंटेनर इटरेटर के रूप में एक पॉइंटर का उपयोग मानक

मैं इसे शोध शुरू किया और पाया कि vector iterators के लिए आवश्यकता केवल कि वे "Random Access Iterators" जिसके लिए यह स्पष्ट रूप से कहा गया है था कि संकेत अर्हता:

एक सरणी संतुष्ट सभी आवश्यकताओं को

का एक तत्व के लिए एक सूचक

एकमात्र कारण यह है कि कंपाइलर भी डीबगिंग उद्देश्यों के लिए vector पर इटरेटर प्रदान करते हैं, या वास्तव में vector पर मुझे याद की आवश्यकता है?

+0

बाकी मानक पुस्तकालय के साथ स्थिरता की अधिक संभावना है। 'टेम्पलेट <वर्ग कंटेनर> शून्य डस्टफ (कॉन्स कंटेनर और सी) {के लिए (कंटेनर :: इटरेटर i = c.begin(); i! = c.end(); ++ i) {...}}' एक टेम्पलेट इस तरह से यह ध्यान नहीं देता कि आप किस प्रकार के कंटेनर का उपयोग करते हैं जब तक यह 'इटरेटर', 'स्टार्ट' और 'एंड' प्रदान करता है। – 0x5453

+0

@ 0x5453 मुझे समझ में नहीं आता कि आप क्या कह रहे हैं? जाहिर है कंटेनर को इटरेटर वापस करना होगा। मैंने अभी नहीं सोचा था कि लौटने वाले कच्चे पॉइंटर्स उचित थे। क्या आप उस कथन को संबोधित कर रहे हैं, या कुछ और? –

+0

मुश्किल हिस्सा 'std :: vector :: iterator' के एडीएल से जुड़े नामस्थान हैं। पॉइंटर्स के पास संबंधित नामस्थान के रूप में 'std' नहीं है। मानक को इटरेटर को संबंधित नामस्थान के रूप में 'std' होने की आवश्यकता नहीं है, हालांकि। – MSalters

उत्तर

3

§ 24.2.1

के बाद से iterators संकेत के एक अमूर्त रहे हैं, उनके अर्थ विज्ञान C++ में संकेत के शब्दों के सबसे का सामान्यीकरण है। यह सुनिश्चित करता है कि प्रत्येक फ़ंक्शन टेम्पलेट जो इटरेटर लेता है नियमित पॉइंटर्स के साथ-साथ काम करता है।

तो हाँ, एक सूचक का उपयोग Random Access Iterator के लिए सभी आवश्यकताओं को पूरा करता है।

std::vector संभावना कुछ कारणों

  1. मानक का कहना है यह होना चाहिए के लिए iterators प्रदान करता है।

  2. यह अजीब होगा अगर कंटेनर जैसे std::map या std::set प्रदान की iterators जबकि std::vector केवल एक value_type* सूचक प्रदान की जाएगी। Iterators कंटेनर लाइब्रेरी में स्थिरता प्रदान करते हैं।

  3. यह वेक्टर प्रकार की विशेषज्ञता के लिए अनुमति देता है जैसे std::vector<bool> जहां value_type* सूचक एक मान्य इटरेटर नहीं होगा।

+0

आप कथन पर "मानक कहता है" यह कहता है "इटरेटर पॉइंटर्स का एक अमूर्त है" सही? –

+0

"मानक कहता है कि इसे" चाहिए "वेक्टरों के लिए इटरेटर क्यों हैं। संख्या 2 और 3 केवल दो संभावित कारण हैं * क्यों * मानक कहता है कि इसे चाहिए। – lcs

2

मेरे 50 सेंट:

Iterators किसी भी एसटीएल कंटेनर का उपयोग करने के सामान्य तरीके हैं। मुझे लगता है कि आप क्या कह रहे हैं: चूंकि पॉइंटर्स वैक्टर के लिए इटरेटर के प्रतिस्थापन के रूप में ठीक हैं, वेक्टरों के लिए इटरेटर क्यों हैं?

अच्छा, किसने कहा कि आप C++ में डुप्लिकेट नहीं कर सकते हैं? वास्तव में एक ही कार्यक्षमता के लिए अलग-अलग इंटरफेस रखना एक अच्छी बात है। यह एक समस्या नहीं होनी चाहिए।

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

+0

आप किस ऑपरेशन का जिक्र करेंगे, इसे इटरेटर और पॉइंटर्स के बीच अलग-अलग किया जाना चाहिए? मैं वास्तव में किसी के बारे में नहीं सोच सकता। –

+0

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

+0

@Carmageddon क्या आप मुझे एक उदाहरण दे सकते हैं कि आप एक सूचक के साथ एक इटरेटर के साथ अलग तरीके से कैसे काम करेंगे? यह एक अच्छा जवाब है यदि पॉइंटर्स को अलग-अलग इलाज किया जाना चाहिए या इटरेटर से अलग तरीके से कार्य करना चाहिए। लेकिन अगर वे समान ऑपरेटरों को प्रदान करते हैं, और समान व्यवहार करते हैं तो यह एक अच्छा जवाब नहीं है। (मैं कई वर्षों से इटरेटर के साथ एक दूसरे के साथ पॉइंटर्स का उपयोग कर रहा हूं।) –

2

क्या उन टिप्पणियों कह रहे हैं कि

template <typename T, ...> 
class vector 
{ 
public: 
    typedef T* iterator; 
    typedef const T* const_iterator; 
    ... 
private: 
    T* elems; // pointer to dynamic array 
    size_t count; 
    ... 
} 

मान्य है। इसी प्रकार std:: एल्गोरिदम के साथ उपयोग के लिए लक्षित उपयोगकर्ता परिभाषित कंटेनर ऐसा कर सकता है। फिर जब एक टेम्पलेट Container::iterator के लिए पूछता है तो उस स्थिति में उस तत्कालताT* है, और यह ठीक से व्यवहार करता है।

तो मानक के लिए vector की vector::iterator की परिभाषा है, और आप इसे अपने कोड में उपयोग करते हैं। एक मंच पर इसे एक सरणी में एक सूचक के रूप में लागू किया जाता है, लेकिन एक अलग मंच पर यह कुछ और है। महत्वपूर्ण रूप से ये चीजें मानक पहलुओं के सभी पहलुओं में समान तरीके से व्यवहार करती हैं।

+0

मेरा मानना ​​है कि यह एकमात्र उत्तर है जो ओपी के असली अंडरलिंग प्रश्न को संबोधित करता है। – Angew

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