2009-07-27 7 views
11

क्या सी ++ मानक कहता है कि मुझे समानता के लिए दो डिफ़ॉल्ट-निर्मित एसटीएल इटरेटर्स की तुलना करने में सक्षम होना चाहिए? डिफ़ॉल्ट-निर्मित इटरेटर समानता-तुलनीय हैं?ऑपरेटर के साथ डिफ़ॉल्ट-निर्मित इटरेटर्स की तुलना ==

मैं निम्नलिखित चाहते हैं, उदाहरण के लिए std :: सूची का उपयोग:

void foo(const std::list<int>::iterator iter) { 
    if (iter == std::list<int>::iterator()) { 
     // Something 
    } 
} 

std::list<int>::iterator i; 
foo(i); 

मैं यहाँ क्या चाहते iterators के लिए एक शून्य मूल्य की तरह कुछ है, लेकिन मुझे यकीन है कि अगर यह कानूनी है नहीं कर रहा हूँ। एसटीएल कार्यान्वयन में विजुअल स्टूडियो 2008 के साथ शामिल है, इसमें std :: list's operator ==() में दावा शामिल हैं जो इस उपयोग को रोकते हैं। (वे जांचते हैं कि प्रत्येक इटरेटर एक ही कंटेनर द्वारा "स्वामित्व" होता है और डिफ़ॉल्ट-निर्मित इटरेटर्स में कोई कंटेनर नहीं होता है।) यह संकेत देगा कि यह कानूनी नहीं है, या शायद वे अत्यधिक उत्साही हैं।

+0

'बूस्ट :: वैकल्पिक 'दिमाग में आता है। – MSalters

उत्तर

15

ठीक है, मैं एक स्टैब ले जाऊंगा। सी ++ स्टैंडर्ड, धारा 24.1/5:

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

तो, नहीं, उनकी तुलना नहीं की जा सकती है।

+0

अच्छा, आपको यह मिला :) – AraK

+0

'std :: istream_iterator के बारे में क्या है। यह ठीक है कि आप अंत के लिए परीक्षण की तुलना कैसे करते हैं। –

1

मेरा मानना ​​है कि आपको रेंज फ़ंक्शन में पास करना चाहिए।

void fun(std::list<int>::iterator beg, std::list<int>::iterator end) 
{ 
    while(beg != end) 
    { 
     // do what you want here. 
     beg++; 
    } 
} 
+1

संभवतः सच है, लेकिन सवाल का जवाब नहीं देता है। –

+0

हाँ, बस मेरे 2 सेंट :) – AraK

+1

मैं समझता हूं कि आप क्या कह रहे हैं, लेकिन अर्थशास्त्र वास्तव में एक आइटम के लिए कॉल करता है - जैसे std :: list :: erase()। मैं एक पुनरावर्तक की अवधारणा का दुरुपयोग कर सकता हूं; यही वह है जो मुझे खोजने में रूचि रखता है। – Adrian

1

विशिष्टता का कहना है कि डिफ़ॉल्ट कन्स्ट्रक्टर का पोस्टकंडिशन यह है कि इटरेटर singular है। समानता की तुलना अपरिभाषित है, इसलिए यह कुछ कार्यान्वयन में भिन्न हो सकती है।

6

यह सी ++ 14 में बदलने जा रहा है। [Forward.iterators] N3936 के 24.2.5p2 कहते

हालांकि, मूल्य-प्रारंभ iterators तुलना की जा सकती और एक ही प्रकार के अन्य मूल्य प्रारंभ iterators के बराबर की तुलना करेगा।

+0

मैंने काम पर कुछ कार्यान्वित करते समय इसे अभी मारा :(मैं चाहता था कि मेरे पास सी ++ 2014 था लेकिन सिर्फ दृश्य स्टूडियो 2012: डी –

+0

यह अभी भी सी ++ 14 में एक अच्छा विचार नहीं है क्योंकि गैर-एकवचन इटरेटर मूल्य-प्रारंभिक पुनरावर्तक के खिलाफ तुलना नहीं की जाएगी। –

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