2010-08-03 11 views
48

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

उदाहरण के लिए, मेरे पास है:

std::list<void*> address_list; 
std::list<void*>::iterator iter; 

क्या आईटीईआर initialised किया जाएगा करने के लिए?

+0

'std :: list :: iterator iter;' __definition__ है। हालांकि सभी परिभाषाएं घोषणाएं हैं, एक घोषणा जो परिभाषा नहीं है: 'बाहरी std :: सूची :: iterator iter;'। – sbi

+0

विशेष रूप से, निर्माता _definition_ से संबंधित है, कोई अन्य घोषणा नहीं। इसका मतलब है कि आप केवल (एकल) परिभाषा में कन्स्ट्रक्टर को मान पास कर सकते हैं। इसके अलावा, अगर ctor एक टेम्पलेट है (यहां की तरह), यह तत्काल है जहां परिभाषा है। – MSalters

उत्तर

43

सम्मेलन कंटेनरों के लिए एक "नल इटरेटर" है, जो कोई परिणाम से संकेत मिलता है के लिए इस्तेमाल किया गया है, बराबर तुलना container.end() के परिणामस्वरूप।

std::vector<X>::iterator iter = std::find(my_vec.begin(), my_vec.end(), x); 
if (iter == my_vec.end()) { 
    //no result found; iter points to "nothing" 
} 

हालांकि, बाद से एक डिफ़ॉल्ट-निर्माण कंटेनर इटरेटर किसी विशेष कंटेनर से संबद्ध नहीं है, वहाँ कोई अच्छा मूल्य इसे ले सकता है। इसलिए यह केवल एक अनियमित चर है और इसके साथ करने का एकमात्र कानूनी संचालन एक वैध इटरेटर को असाइन करना है।

std::vector<X>::iterator iter; //no particular value 
iter = some_vector.begin(); //iter is now usable 

iterators के अन्य प्रकार के लिए यह सच नहीं हो सकता है। 0.gके मामले में, एक डिफ़ॉल्ट-निर्मित इटरेटर एक istream_iterator का प्रतिनिधित्व करता है (बराबर तुलना करता है) जो इनपुट स्ट्रीम के ईओएफ तक पहुंच गया है।

+2

एक प्रारंभिक इटरेटर के अस्तित्व के लिए एक प्रस्ताव है। देखें http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2013/n3644.pdf – Ghita

+3

उस प्रस्ताव के तहत ऑटो ni = vector :: iterator() एक शून्य वेक्टर इटरेटर जो एक ही प्रकार के किसी अन्य पुनरावर्तक के बराबर तुलना करेगा – Ghita

10

इटेटरेटर प्रारंभ नहीं किया गया है, जैसे int x; एक पूर्णांक घोषित करता है जिसे प्रारंभ नहीं किया गया है। यह एक उचित परिभाषित मूल्य नहीं है।

+2

क्या इसे शून्य में प्रारंभ करने का कोई तरीका है? –

+3

@ शून्य: आपका प्रश्न कोई समझ नहीं आता है। 'NULL' एक मान _pointers_ हो सकता है, bot iterators। जबकि सभी पॉइंटर्स इटरेटर हैं, सभी इटरेटर पॉइंटर्स नहीं हैं। – sbi

+0

तो, जब एक पूर्ण सूचक के रूप में ऐसी चीज है, तो "नल इटरेटर" जैसी कोई चीज़ नहीं है? –

20

डिफ़ॉल्ट निर्माता एक विलक्षण मूल्य के लिए एक इटरेटर initializes:

Iterators एकवचन मान जो किसी भी क्रम से संबद्ध नहीं हैं हो सकता है। [उदाहरण: एक प्रारंभिक सूचक एक्स (जैसे int * x;) के घोषणापत्र के बाद, x हमेशा एक सूचक का एकवचन मान माना जाना चाहिए। अंत उदाहरण] सबसे अभिव्यक्ति की परिणाम विलक्षण मूल्यों के लिए अपरिभाषित हैं [24.2.1 §5]

+11

मेरा मानकीकरण विचलन फिर से हड़ताली। ' 'समझने योग्य भाषण में इसका क्या अर्थ है? – sbi

+1

@ एसबीआई: ठीक है, अनुच्छेद आगे बढ़ता है, मैंने इसे काटने का फैसला किया। असल में, आपको एकवचन मूल्य के साथ कुछ भी उपयोगी करने की अनुमति नहीं है, उदाहरण के लिए इसे अस्वीकार करें या इसकी तुलना करें। – fredoverflow

+6

@ एसबीआई: "अजीब" के साथ "एकवचन" के सभी उदाहरणों को प्रतिस्थापित करें। आपको इसके साथ कुछ भी करने की अनुमति नहीं है क्योंकि यह एक अजीब स्थिति में है। – jalf