2017-09-17 12 views
5

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

reverse_iterator<int*> r{}; 
r --; 

और कार्यक्रम दुर्घटनाग्रस्त हो गया। मेरा मानना ​​है कि इस उपयोग का कोई मतलब नहीं है और यह आसानी से दुर्घटना का कारण बन सकता है, तो डिफ़ॉल्ट कन्स्ट्रक्टर का उपयोग क्यों किया जाता है?

+2

शायद "अनियमित" इटेटर को घोषित करने का समर्थन करने के लिए केवल एक विशिष्ट मूल्य असाइन किया जाए। बस डिफॉल्ट-निर्मित इटरेटर्स को अनियमित चर के रूप में देखें, यानी जब तक आप एक सार्थक मूल्य असाइन नहीं करते हैं तब तक उनके साथ कुछ भी न करें। – AnT

+0

आपको एक पॉइंटर को परिभाषित करने की अनुमति क्यों दी जाती है जो 'nullptr' को इंगित करती है और फिर इसे अस्वीकार करती है? ऐसी कई चीजें हैं जिन्हें बहुत असुरक्षित, अपरिभाषित भी किया जाता है। यह सी ++ की गति देता है और यह शूट-स्वयं-इन-द-पैर स्थिति है। –

+0

@ रिकस्टली मुझे विश्वास है कि सी ++ मानक लाइब्रेरी "इच्छाशक्ति पर शूट फीट" मानसिकता से चली गई है, "यदि आप कुछ भी खर्च नहीं करते हैं तो आप अपने पैरों को गोली मार नहीं पाएंगे"। कुछ असुरक्षित होने की अनुमति देने के लिए और कारण होंगे –

उत्तर

3

std::reverse_iteratorbidirectional iterators हैं, जिनकी एक अलग आवश्यकता है कि वे डिफ़ॉल्ट-रचनात्मक हो।

why bidirectional iterators are default-constructible के रूप में, यह ज्यादातर इसलिए है क्योंकि यह लगभग निश्चित है कि वे लागू करने के लिए तुच्छ हैं और इस तरह की गारंटी देने से एल्गोरिदम लागू करना आसान हो जाता है।

int* p = nullptr; *p; जैसी चीजें लिखना स्वयं ही यूबी है, यह पूर्व शर्त का उल्लंघन करता है कि p भरोसेमंद हो, एडाप्टर इस तरह के व्यवहार को "अपनाने" देने के बजाय प्राकृतिक हैं।

3

cppreference पर दस्तावेजीकरण का कहना है:

1) डिफ़ॉल्ट निर्माता। वर्तमान मूल्य-प्रारंभिक है। परिणामी इटेटरेटर पर संचालन ने व्यवहार को परिभाषित किया है यदि केवल और यदि मूल्य-प्रारंभिक इटरेटर पर संबंधित संचालन ने व्यवहार को परिभाषित किया है।

कुछ iterators कि डिफ़ॉल्ट का निर्माण होने के लिए सार्थक होते हैं; आम तौर पर उन लोगों को नहीं जो सीधे कंटेनर से जुड़े होते हैं (जिन्हें मैं जानता हूं)। उदाहरण के लिए एक आईट्रीम इटरेटर: http://en.cppreference.com/w/cpp/iterator/istream_iterator/istream_iterator। हालांकि, यह द्विपक्षीय नहीं है, इसलिए आप इसे उलट नहीं सकते हैं।

हालांकि, सिद्धांत रूप में, आप एक पुनरावर्तक हो सकते हैं जो दोनों द्विपक्षीय है, और जिसका डिफ़ॉल्ट कन्स्ट्रक्टर/मूल्य प्रारंभकर्ता कम से कम कुछ परिचालन परिभाषित करता है। इस तरह के एक इटरेटर के लिए, आप चाहते हैं कि व्यवहार reverse_iterator के माध्यम से दिखाई दे।

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