2013-03-02 10 views
9

के साथ एक std :: वेक्टर को अनुक्रमणित करना मैंने नकारात्मक सूचकांक का उपयोग कर vector को अनुक्रमणित करने का प्रयास किया। vector::at() सदस्य फ़ंक्शन जांचता है कि निर्दिष्ट अनुक्रमणिका वेक्टर की सीमाओं के भीतर है, और यदि ऐसा नहीं होता है, तो out_of_range अपवाद फेंक दिया जाता है।एक नकारात्मक इंडेक्स

vector<float> array; // sample vector 
array.push_back(0.123); 
array.push_back(1.234); 
array.push_back(2.345); 
array.push_back(3.456); 
array.push_back(4.567); 

int index = -1; 
float f = array.at(index); 
cout << f << endl; 

vector::at() सदस्य समारोह के हस्ताक्षर की आवश्यकता है कि निर्दिष्ट पैरामीटर vector<T>::size_type प्रकार का है, और इस प्रकार के वेक्टर के लिए unsigned int है, इसलिए संकलक int से एक अंतर्निहित रूपांतरण (index चर के प्रकार के) प्रदर्शन करना चाहिए unsigned int पर। चूंकि index मूल्य ऊपर के उदाहरण में -1 है, परोक्ष परिवर्तित index4294967295 (कि unsigned int प्रकार की अधिकतम मूल्य है): यह मान vector::at() सदस्य समारोह है, जो एक out_of_range अपवाद फेंकता में भेजा जाता है।

दूसरे शब्दों में, यह अपवाद फेंक दिया जाता है नहीं vector::at() सदस्य समारोह में देखता है क्योंकि उस index शून्य से भी कम है, बल्कि इसलिए कि परोक्ष परिवर्तित indexvector के वर्तमान आकार से बड़ा होता है। क्या यह एक सही स्पष्टीकरण है?

+0

हां, मूल रूप से। – Dave

+0

हां, यह सही स्पष्टीकरण है। – syam

उत्तर

8

हां, यह एक सही व्याख्या है। (at को vector::size_type लेता है, आमतौर पर std::size_t, जो कुछ अनिर्दिष्ट हस्ताक्षरित पूर्णांक प्रकार (आमतौर पर आपके सिस्टम पर पॉइंटर्स की बिट-चौड़ाई) होता है। यह आपके सिस्टम पर unsigned int होने की अनुमति है, लेकिन मानक द्वारा अनिवार्य नहीं है; 32 बिट unsigned int । 64 बिट size_t आम है)

एक के रूप में एक तरफ, पर हस्ताक्षर किए रूपांतरण के लिए अहस्ताक्षरित के साथ सावधान रहना: मानक की आवश्यकता नहीं है यह एक राउंड ट्रिप जा signed-> unsigned-> ऋणात्मक मानों, और कुछ compilers के लिए हस्ताक्षर किए आक्रामक तरीके से अप्रत्याशित तरीकों से अनुकूलित करें।

+0

इसका क्या अर्थ है कि मानक को नकारात्मक मानों के लिए उलटा होने की आवश्यकता नहीं है? – enzom83

+4

'(int) (हस्ताक्षरित) -1 == -1' सत्य होने की आवश्यकता नहीं है। – Yakk

+0

"कुछ कंपाइलर्स अप्रत्याशित तरीकों से आक्रामक रूप से अनुकूलित होते हैं" - यह रूपांतरण * कार्यान्वयन-परिभाषित * है इसलिए कोई ऑप्टिमाइज़ेशन आश्चर्य नहीं होना चाहिए –

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