2013-10-06 6 views
8

पढ़ना कार्यकारी ड्राफ्ट N3337-1, प्रोग्रामिंग भाषा सी के लिए मानक ++, 24.2.5 फॉरवर्ड iterators, पेज 806.सी ++ आईएसओ मानक प्रति बहु-पास गारंटी क्या है?

मसौदा से:

दो dereferenceable iterators a और प्रकार के bX प्रस्ताव बहु-पास गारंटी यदि:
- a == b तात्पर्य ++a == ++b और
- X एक सूचक प्रकार या अभिव्यक्ति (void)++X(a), *a अभिव्यक्ति *a के बराबर रहा है।

[नोट: आवश्यकता है कि a == b तात्पर्य ++a == ++b (जो इनपुट और आउटपुट iterators लिए सच नहीं है) और एक परिवर्तनशील इटरेटर (उत्पादन iterators पर लागू होता है जो) के माध्यम से कार्य की संख्या पर प्रतिबंध को हटाने के उपयोग की अनुमति देता आगे इटरेटर्स के साथ बहु-पास एक-दिशात्मक एल्गोरिदम का। -end नोट]

क्या कोई इसे आसान शब्दों में फिर से समझ सकता है? मैं समझता हूं कि फॉरवर्ड इटरेटर बहु-पास हैं, लेकिन मुझे समझ में नहीं आता कि यह सी ++ मानक आवश्यकताओं के अनुसार कैसे पूरा किया जाता है।

+1

+1 क्योंकि मुझे यह समुदाय के लिए उपयुक्त लगता है, भले ही यह विशिष्ट प्रोग्रामिंग समस्या का समाधान न करे और क्योंकि किसी को वास्तव में सी ++ मानक पढ़ने में कठिनाई हो सकती है। – LihO

उत्तर

13

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

उद्धृत खंड मूल रूप से कहते हैं, कि अगर आप बराबर की तुलना दो iterators है और आप उनमें से हर एक को बढ़ा देते हैं, तो आप एक ही स्थिति के लिए मिलता है और वे फिर से बराबर की तुलना:

if (it1 == it2) { 
    ++it1; 
    ++it2; 
    assert(it1 == it2); // has to hold for multi-pass sequences 
} 

कुछ हद तक अजीब अभिव्यक्ति ++X(a), *a मूल रूप से a पर स्वतंत्र एक पुनरावर्तक को अग्रिम करने का इरादा है और ++X(a), *a*a के समतुल्य होने की आवश्यकता का मूल रूप से अर्थ है कि एक स्वतंत्र इटरेटर का उपयोग करके अनुक्रम पर इटरेटर a को संदर्भित नहीं करता है। यह इनपुट इटरेटर के विपरीत है जहां ++InIt(a), *a आवश्यक नहीं है *a के बराबर नहीं है क्योंकि पहली अभिव्यक्ति स्थिति बदल सकती है, संभावित रूप से a को अमान्य कर सकती है और/या उस मान को बदल सकती है जिसका संदर्भ है।

इसके विपरीत, एकल-पास अनुक्रम (मानक शब्दों में इनपुट और आउटपुट पुनरावृत्तियों) को केवल एक बार ट्रैव किया जा सकता है: अनुक्रम को पार करने की कोशिश करने से कई बार काम नहीं करना पड़ेगा। इस तरह के अनुक्रमों का कैनोलिक उदाहरण कुंजीपटल से इनपुट और कंसोल में आउटपुट होता है: एक बार पढ़ा जाता है, आप एक ही अक्षर को फिर से वापस नहीं प्राप्त कर सकते हैं और एक बार भेजे जाने पर आप पात्रों को पूर्ववत नहीं कर सकते हैं।

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