2012-04-30 11 views
6

क्यूटी में एक मानचित्र सूचीबद्ध करने के लिए समान वर्ग हैं। ये कक्षाएं start_const() विधि प्रदान करती हैं जो एक const_iterator देता है। प्रलेखन का कहना है कि जब भी वे तेज़ होते हैं तो इन const_iterators का उपयोग किया जाना चाहिए।इटरेटर और const_iterator (एसटीएल) की विभिन्न दक्षता

एसटीएल केवल उदाहरण के आधार पर आपको एक const_iterator देता है। केवल एक प्रारंभ() विधि लागू की गई है (कॉन्स के लिए अधिभारित)।

क्या इटरेटर और const_iterator के साथ तत्वों को पढ़ने-एक्सेस करने में कोई अंतर है? (मैं क्यों क्यूटी में उनके लिए एक अंतर पता dont'w)

+2

जब आप प्राचीन स्टेल से सी ++ मानक लाइब्रेरी के वर्तमान संस्करण में स्विच करते हैं, तो आपको एक cbegin फ़ंक्शन मिलेगा जो const_iterators देता है। यह भी ध्यान रखें कि आप iterators को const_iterators को असाइन कर सकते हैं और प्रारंभ का कॉन्स संस्करण एक कॉन्स इटरेटर भी देता है (सभी सी ++ मानक लाइब्रेरी के लिए)। – PlasmaHH

+0

मेरा संदर्भ cplusplus.com था। कोई cbegin() नहीं है। क्या आप मुझे एक अच्छा और अधिक अद्यतित एसटीएल संदर्भ के लिए इंगित कर सकते हैं? अब सवाल और भी दबाने वाला है क्योंकि एक cbegin() विधि है ... – HWende

+0

प्लाज़्माएचएच इंगित करने वाला फ़ंक्शन सी ++ 11 का हिस्सा है: [आलेख] (http://www.cplusplus.com/articles/EzywvCM9 /) लेकिन मुझे नहीं पता कि कॉन्स्ट इटरेटर के बजाय इटरेटर का उपयोग करने के लिए प्रदर्शन समस्याएं हैं या नहीं। – Uflex

उत्तर

5

प्रलेखन का कहना है कि इन const_iterators जब भी संभव हो, क्योंकि वे तेजी से कर रहे हैं इस्तेमाल किया जाना चाहिए।

यह सुनिश्चित करता है। http://qt-project.org/doc/qt-4.8/containers.html#stl-style-iterators से:

प्रत्येक कंटेनर वर्ग के लिए, वहाँ दो एसटीएल शैली इटरेटर प्रकार के होते हैं: एक प्रावधान है कि केवल पढ़ने के लिए उपयोग और एक जो पढ़ने-लिखने की पहुंच प्रदान करता है। जहां भी संभव हो केवल पढ़ने वाले इटरेटर्स का उपयोग किया जाना चाहिए क्योंकि वे रीड-राइट इटरेटर्स से तेज़ हैं।

क्या कहना बेवकूफ बात है।

सुरक्षित? हाँ। और तेज? यहां तक ​​कि यदि यह मामला था (यह स्पष्ट रूप से जीसीसी और क्लैंग के साथ नहीं है), यह शायद ही कभी गैर-आधार वाले लोगों पर कॉन्स इटरेटर्स को प्राथमिकता देने का एक कारण है। यह समयपूर्व अनुकूलन है। गैर-आधार वाले लोगों पर कॉन्स इटरेटर्स को प्राथमिकता देने का कारण सुरक्षा है। यदि आपको संशोधित करने के लिए इंगित करने वाली सामग्री की आवश्यकता नहीं है, तो एक कॉन्स इटरेटर का उपयोग करें। इस बारे में सोचें कि आपके रखरखाव प्रोग्रामर आपके कोड पर क्या करेंगे।

बनाम cbegin से संबंधित है, यह एक सी ++ 11 अतिरिक्त है। यह auto कीवर्ड को कॉन्स्ट इटरेटर का उपयोग करने की अनुमति देता है, यहां तक ​​कि गैर-कॉन्स्ट सेटिंग में भी।

+0

तो अगर किसी भी तरह Qt I में कोई अंतर हो सकता है तो अब मान लें कि सी ++ में कोई भी नहीं है। मैं प्रदर्शन कारण के कारण सामान्य/स्थिरता को अनदेखा नहीं करने के लिए भी सहमत हूं। स्पष्ट बयान के लिए धन्यवाद! – HWende

3

कास्ट का उपयोग करने का सबसे अच्छा कारण है बग से बचने और कोड के इरादे को और स्पष्ट करना।

यह कल्पना की जा सकती है कि, कुछ मामलों में, कंपाइलर कुछ ऑप्टिमाइज़ेशन कर सकता है जो गैर-कॉन्स इटरेटर के साथ संभव नहीं होगा। एलिसिंग (जब एकाधिक चर और पैरामीटर एक ही ऑब्जेक्ट का संदर्भ दे सकते हैं) अक्सर कुछ अनुकूलन का अवरोधक होता है। यदि संकलक इस बात को ध्यान में रखते हुए एलियासिंग के कुछ रूपों को रद्द कर सकता है कि कॉन्स्ट-इटरेटर कभी भी मूल्य नहीं बदल सकता है, तो शायद यह कुछ अनुकूलन सक्षम करेगा।

दूसरी तरफ, मैं एक संकलक की अपेक्षा करता हूं जो प्रवाह विश्लेषण के साथ एक ही निष्कर्ष तक पहुंचने में सक्षम होने के लिए उस तरह से स्थिरता का उपयोग करने के लिए पर्याप्त है।