2012-05-01 12 views
10

मुझे कोई मानक एल्गोरिदम नहीं मिल रहा है जो डिफ़ॉल्ट रूप से ForwardIterator बनाने के लिए आवश्यकता को प्रदर्शित करेगा।फॉरवर्डइटर को डिफॉल्ट कॉन्स्ट्रक्टेबल मॉडल करने की आवश्यकता क्यों है?

क्या इसके लिए कोई वास्तविक कारण है, या क्या मैं इसे अनदेखा करने के लिए सुरक्षित हूं?

+4

इससे कोई फर्क नहीं पड़ता कि इसके लिए कोई वास्तविक कारण है; यह आवश्यक है*। तो अपने जोखिम पर आवश्यकता को नजरअंदाज करें। –

+1

ठीक है, अगर इटेटरेटर तर्कसंगत रूप से तर्क पर निर्भर करता है, तो विकल्प डिफ़ॉल्ट कन्स्ट्रक्टर को जोड़ना है जो ऑब्जेक्ट को अमान्य स्थिति में छोड़ देता है, जो खतरे के साथ छेड़छाड़ भी करता है। – Ayjay

+0

ए * काम * विकल्प आपके इटरेटर को बदलना होगा ताकि वे किसी तर्क पर भरोसा न करें। उन्हें एक वैध लेकिन अवधारणात्मक खाली स्थिति में रखें। –

उत्तर

4

मानक एल्गोरिदम और क्लाइंट उपयोगकर्ताओं दोनों के लिए, इस तरह के इटरेटर के उपयोग को कम करने के लिए यह है।

उदाहरण के लिए (याद रखें कि RandomAccessIteratorForwardIterator की एक उप-प्रकार है):

template <class RandomAccessIterator> 
    void sort (RandomAccessIterator first, RandomAccessIterator last) 
{ 
    RandomAccessIterator pivot, i, j; 
    //do your sorting algorithm   
} 

अगर वे constructible डिफ़ॉल्ट नहीं कर रहे थे आप इसे संकलित करने के लिए बस के लिए first या last करने के लिए उन्हें आवंटित करने के लिए की आवश्यकता होगी।

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

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

+0

यह 'RandomAccessIterator' के लिए 'डिफ़ॉल्ट कॉन्स्ट्रक्टिबल' मॉडल के लिए एक तर्क है, हालांकि 'फॉरवर्डइटरेटर' नहीं है। 'डिफॉल्ट कॉन्टेक्टीबल' मॉडल करने के लिए 'इनपुट इटरेटर' की आवश्यकता नहीं है, क्यों 'फॉरवर्डइटरेटर'? – Ayjay

+1

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

+0

वैसे यह कोड RAII आधारित कोडिंग दिशानिर्देशों के खिलाफ होगा जहां परिभाषा के बिंदु पर प्रारंभिकता अनिवार्य है। – dirkgently

3
मसौदा की मेरी नकल से

:

24.2.5 फॉरवर्ड iterators [forward.iterators]

एक वर्ग या एक अंतर्निहित प्रकार एक्स एक की आवश्यकताओं को संतुष्ट आगे इटरेटर

[...]

अगर - एक्स संतुष्ट DefaultConstructible आवश्यकताओं (20.2.1),

और उसके बाद:

20.2.1 खाका तर्क आवश्यकताओं

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

यहाँ नोट करने के लिए दो बातें हैं:

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

ऐसा लगता है कि फॉरवर्डइटरेटर को डिफॉल्ट कॉन्स्ट्रक्टेबल की आवश्यकता है यदि आप इसके साथ "कुछ कंटेनर क्लास सदस्य फ़ंक्शन हस्ताक्षर" में से एक को कॉल करते हैं। क्या मानक किसी भी समय निर्दिष्ट होता है जब यह होना चाहिए? – Ayjay

+0

@ ऐजय: मानक को ऐसे किसी भी सदस्य कार्य प्रदान करना चाहिए। मैं कफ से एक का नाम नहीं दे सकता, लेकिन अगर कोई नहीं है तो मुझे आश्चर्य नहीं होगा। मुझे यह संकेत देना चाहिए कि भविष्य में लाइब्रेरी लेखकों को कुछ हद तक कम करने का यह तरीका था। – dirkgently

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