2012-07-06 16 views
11

संस्करण एक:इटरेटर और const_iterator अक्षम के बीच तुलना कर रहे हैं?

const auto end = whatever.end(); 
for (auto it = whatever.begin(); it != end; ++it) 
{ 
    // ... 
} 

संस्करण ख:

const auto end = whatever.cend(); // note the call to cend insteand of end here 
for (auto it = whatever.begin(); it != end; ++it) 
{ 
    // ... 
} 

के बाद से पाश हालत iterators दो भिन्न प्रकार तुलना वहाँ विश्वास है कि संस्करण ख प्रकार एक से भी कम समय कुशल हो जाएगा किसी भी कारण है? क्या यह it पर एक अंतर्निहित रूपांतरण का कारण बनता है?

(end इसे बाहर फहराने की मेरी इच्छा पाश के लिए अंदर कई बार इस्तेमाल किया जाता है, इसलिए।)

+0

किस कंटेनर के लिए? –

+0

@ डेविड मेरे विशिष्ट मामले में, यह एक 'std :: string' है, लेकिन मैं सामान्य रूप से उत्सुक हूं। – fredoverflow

उत्तर

12

सिद्धांत रूप में, यह कम कुशल हो सकता है और गैर शून्य लागत के साथ एक अंतर्निहित रूपांतरण हो सकती थी।

अभ्यास में, iterator और const_iterator (या तो एक दूसरे से निकला है, या दोनों एक _iterator_base से निकाले जाते हैं) एक विरासत संबंध में भाग लेने के ऐसी है कि असमानता ऑपरेटर आधार वर्ग पर परिभाषित किया गया है की संभावना है और के लिए कोई जरूरत नहीं है एक अंतर्निहित रूपांतरण (इसके बजाए, अधिक व्युत्पन्न इटरेटर को नजरअंदाज कर दिया जाता है)। इन की अनुपस्थिति में भी, रूपांतरण को रेखांकित और ऑप्टिमाइज़ करने के लिए पर्याप्त छोटा होने की संभावना है।

libstdC++, अलग ढंग से इन तुलना का अनुकूलन operator== और operator!= को परिभाषित करने iterator और const_iterator के बीच से: http://gcc.gnu.org/onlinedocs/libstdc++/libstdc++-html-USERS-4.3/a02037.html#l00295

libC++ किसी भी अनुकूलन नहीं है: http://llvm.org/svn/llvm-project/libcxx/trunk/include/__tree - हालांकि फिर से iterator से const_iterator के निर्माता है कि मैं था तो मामूली बात है उम्मीद है कि इसे पूरी तरह से अनुकूलित किया जाएगा।